所有帐户应该工作的简单示例:
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顺便说一句。
答案 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)
对于那些来这里寻求解决方案来孤立地测试他们的控制器问题的人(就像我一样),使用setup
和teardown
块而不是用{{1块:
with_routing
对Rails 5.0.2进行了测试。