我最近开始在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