我对我的一些控制器操作进行了一系列重复测试,所有操作都需要身份验证。因此,您最终会看到许多代码,如下所示:
describe "authentication requests" do
it "should return 401 for unauthenticated :show" do
get :show
...
end
it "should return 401 for unauthenticated :create" do
post :create
...
end
end
是否有更好的方法来干掉此代码,以便控制器中需要身份验证的任何操作都可以在一次测试中描述?
答案 0 :(得分:8)
如果需要跨控制器复制测试,可以使用rspec宏。使用如下方法创建spec/macros/controller_macros.rb
:
def should_return_401_for_unauthenticated(test_controller)
describe test_controller, "authentication requests" do
it "should return 401 for show" do
get :show
response.code.should == "401"
end
it "should return 401 for create" do
post :create
response.code.should == "401"
end
end
end
然后在每个需要测试的控制器规范中:
describe MyController do
should_return_401_for_unauthenticated(self)
end
答案 1 :(得分:1)
我不是rspec用户,但您可以执行以下操作:
describe "authentication requests" do
limited_access = [:show, :create]
limited_access.each do |action|
it "should return 401 for unauthenticated :#{action}" do
get action
## assert response 401
end
end
end
或者只进行一次测试:
describe "authentication requests" do
limited_access = [:show, :create]
it "should return 401 for unauthenticated #{limited_access.to_sentence}" do
limited_access.each do |action|
get action
## assert response 401
end
end
end
可以添加一个spec_helper方法来为你抽象......可能性是无穷无尽的。