Rspec:测试所有控制器动作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rspec:测试所有控制器动作相关的知识,希望对你有一定的参考价值。

我有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方法?

答案

虽然我更喜欢逐个测试,但你的问题是可行的。

# 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
另一答案

更好的方法是为控制器中的每个操作方法编写不同的测试。

如果你看看Rails上的文档TestCase类 - 控制器测试是从哪个类创建的(甚至rspec只是包装了这个类),你会明白我的意思:

http://api.rubyonrails.org/classes/ActionController/TestCase.html

文档说:

功能测试允许您测试每个测试方法的单个控制器操作。

目的是控制器测试对控制器中的每个操作都有不同的测试方法。

另一答案

您应该针对控制器的每个操作创建不同的测试,以使测试更具表现力和更易于理解。每个操作主要位于其自己的描述块中,每个有意义的输入都有自己的上下文块。

举个例子:

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"块下的不同上下文块中。你可以找到更详细的解释here

以上是关于Rspec:测试所有控制器动作的主要内容,如果未能解决你的问题,请参考以下文章

如何设置RSpec以最后测试功能,并且仅在所有其他测试通过时

使用 Javascript 进行 Rspec 控制器测试

Rspec 控制器测试,传递 JSON 参数

使用RSpec测试实例化服务类的操作类

Rails/Rspec:测试延迟作业邮件

使用 rspec 测试文件上传 - rails