with_routing测试帮助程序不适用于集成测试

时间:2014-11-21 19:37:38

标签: ruby-on-rails ruby-on-rails-4

所有帐户应该工作的简单示例:

require 'test_helper'

class FoosController < ApplicationController
  def index
    render plain: 'something'
  end
end

class UsersControllerTest < ActionDispatch::IntegrationTest
  def test_some_routing
    with_routing do |set|
      set.draw do
        get '/foos' => 'foos#index'
      end

      get '/foos'
      assert_equal 200, response.status
    end
  end
end

相反,我得到:ActionController::RoutingError: No route matches [GET] "/foos"

我做错了什么?这是最新的Rails 4.1顺便说一句。

3 个答案:

答案 0 :(得分:2)

好的,所以我再次回答我自己的问题。问题是with_routing在集成测试中并不起作用。监督或其他什么,不确定。它仅适用于控制器测试。所以这是解决方法:

class ActionDispatch::IntegrationTest
  def with_routing(&block)
    yield ComfortableMexicanSofa::Application.routes
  ensure
    ComfortableMexicanSofa::Application.routes_reloader.reload!
  end
end

基本上,您将在该块中重新定义应用程序路由,然后从routes.rb文件重新加载它们。

答案 1 :(得分:1)

- 已编辑 - 通过定义一个新方法,我们可以有一个包含新路径的块:

  def with_foo_route
    Rails.application.routes.draw do
      get 'foo' => 'foo#index'
    end
    yield
    Rails.application.routes_reloader.reload!
  end

然后通过以下方式执行对此新路由的get请求:

with_foo_route do
  get '/foo'
  assert_equal 200, status
end

答案 2 :(得分:1)

对于那些来这里寻求解决方案来孤立地测试他们的控制器问题的人(就像我一样),使用setupteardown块而不是用{{1块:

with_routing

对Rails 5.0.2进行了测试。