RSpec Rails登录筛选器



我最近开始在rails(3.0.8)应用程序中使用rspec rails(2.6.1)。我已经习惯了测试::单元,而且我似乎无法让过滤器为我的测试方法工作。我喜欢尽可能保持干燥,所以我想设置一个过滤器,我可以在调用测试方法之前对任何将以Authlogic用户身份登录的测试方法进行调用。我试图通过在spec_helper.rb:中使用RSpec过滤器来实现这一点

config.before(:each, :login_as_admin => true) do 
  post "/user_sessions/create", :user_session => {:username => "admin", :password => "admin"}   
end

然后我在相应的测试方法中使用它(在本例中为spec/controllers/admin_controller_spec.rb):

require 'spec_helper'
describe AdminController do  
  describe "GET index" do        
    it("gives a 200 response when visited as an admin", :login_as_admin => true) do   
      get :index
      response.code.should eq("200")
    end    
  end
end

然而,当我运行rspec-spec:时,我会收到这个错误

Failures:
  1) AdminController GET index gives a 200 response when visited as an admin
     Failure/Error: Unable to find matching line from backtrace
     RuntimeError:
       @routes is nil: make sure you set it in your test's setup method.

Blech。每次测试只能发送一个HTTP请求吗?我还试着去掉authenticate_admin方法(在config.before块中),但没有成功。

不幸的是,目前没有办法在全局定义的before钩子中执行您想要执行的操作。原因是before钩子按照它们注册的顺序执行,而在RSpec.configure中声明的钩子在rspec-rails内部注册之前注册,以设置控制器、请求、响应等。

此外,已向https://github.com/rspec/rspec-rails/issues/391.

您应该使用shulda的宏。要使用should a修改您的spec_helper.rb

RSpec.configure do |config|
  config.include Clearance::Shoulda::Helpers
end

然后可以在控制器规范中设置过滤器,如

require 'spec_helper'
describe AdminController do  
  fixture :users
  before(:each) do
    sign_in_as users(:your_user)
  end
  describe "GET index" do        
    it("gives a 200 response when visited as an admin", :login_as_admin => true) do   
      get :index
      response.code.should eq("200")
    end    
  end
end

相关内容

  • 没有找到相关文章

最新更新