测试控制器,无需通过路由

Dan*_*nor 2 testing rspec ruby-on-rails controllers

我试图孤立地测试我的控制器的动作链.具体来说,我想确保我所需的行为适用于我所有控制器的操作.例如,测试我的所有操作都需要身份验证:

context "when not authenticated" do

  # single case
  describe "GET index" do
    it "responds with 401" do
      get :index
      response.code.should be(401)
    end
  end

  # all of them...
  described_class.action_methods.each do |action|
    ['get', 'put', 'post', 'delete', 'patch'].each do |verb|
      describe "#{verb.upcase} #{action}" do
        it "responds with 401" do
          send verb, action
          response.code.should == "401"
        end
      end
    end   
  end

end
Run Code Online (Sandbox Code Playgroud)

我希望这可行,但事实并非如此.我得到一些ActionController::RoutingErrors.这是因为我的一些路线需要参数,在某些情况下我不提供它们(就像我打电话时post :create).我明白了.但我不明白的是:为什么要重要!?

对于这些测试,路由是一个单独的问题.我关心我的行动链,而不是我的要求(这就是我拥有的routing specs和我request specs的).我不应该关心自己在这个级别的路线限制.

所以我的问题是:有没有办法在不模拟请求的情况下测试动作链?

编辑:一些研究

看起来在TestCase#进程中正在运行路由.这有必要吗?

Dan*_*nor 6

一个解决方法是放松路由引擎的约束.这不会绕过路由,但它确实使测试更容易.

在您的规范中添加以下内容:

before(:all) do
  Rails.application.routes.draw { match ':controller(/:action)' }
end
after(:all) do
  Rails.application.reload_routes!
end
Run Code Online (Sandbox Code Playgroud)

虽然不是严格意义上的答案,但它可能是一个很好的解决方案.