我有 rspec 控制器测试:
describe TestController do
it "test all actions" do
all_controller_actions.each do |a|
expect{get a}.to_not rais_error(SomeError)
end
end
end
如何实现all_controller_actions
方法?
我有 rspec 控制器测试:
describe TestController do
it "test all actions" do
all_controller_actions.each do |a|
expect{get a}.to_not rais_error(SomeError)
end
end
end
如何实现all_controller_actions
方法?
更好的方法是为控制器中的每个操作方法编写不同的测试。
如果你看一下 RailsTestCase
类的文档——控制器测试是从这个类创建的(甚至 rspec 只是包装了这个类),你会明白我的意思:
http://api.rubyonrails.org/classes/ActionController/TestCase.html
文档说:
功能测试允许您测试每个测试方法的单个控制器操作。
目的是控制器测试对控制器中的每个操作都有不同的测试方法。
虽然我更喜欢一一测试,但你的问题是可行的。
# Must state this variable to be excluded later because MyController has them.
a = ApplicationController.action_methods
m = MyController.action_methods
# Custom methods to exclude
e = %w{"create", "post"}
@test_methods = m - a - e
describe TestController do
it "all GET actions got response" do
@test_methods.each do |t|
expect{get t}.to_not rais_error(SomeError)
end
end
end
您应该旨在为控制器的每个操作创建不同的测试,以使测试更具表现力且更易于理解。每个动作大多位于其自己的描述块中,每个有意义的输入都有自己的上下文块。
例如:
describe "Users" do
describe "GET user#index" do
context "when the user is logged in" do
it "should render users#index"
end
context "when the user is logged out" do
it "should redirect to the login page"
end
end
end
该示例对登录和注销用户具有不同的身份验证,我们将其分隔在块下的不同上下文describe "GET user#index"
块中。您可以在此处找到更详细的说明。