答案 0 :(得分:15)
路由应作为集成测试的一部分完成。集成测试是测试应用程序的重要工作流程的地方 - 更具体地说,是否定义了URL似乎是一个重要的工作流程。
您的集成测试看起来像normal integration test:
# /tests/integration/routes_test.rb
require 'test_helper'
class RoutesTest < ActionController::IntegrationTest
test "route test" do
assert_generates "/photos/1", { :controller => "photos", :action => "show", :id => "1" }
assert_generates "/about", :controller => "pages", :action => "about"
end
end
关于@jemminger未测试路线的响应 - 虽然是Rail的测试验证routes.rb是否有效,但是Rail不负责测试路由中是否定义了http://yoursite.com/users
。需要注意的是,大多数路由测试都可以在现有的集成测试中完成,因此路由的特定测试可能是多余的。
我能想到的特定用例是已经或将要从Rails 2升级到Rails 3的所有人。定义路由的代码已经发生了显着变化,最好从测试中找出路径升级正确,而不是用户报告404错误时。
答案 1 :(得分:10)
为什么你觉得需要测试路线?纯粹是为了确保routes.rb中定义的路由确实有用吗?如果是这样,那就不要了。这不是应用程序测试的工作,以确保框架的内部运行正常 - 这是Rails框架自己的测试的工作。
如果您想要测试某种动态/用户可定义的路线,我可能会选择集成。
答案 2 :(得分:6)
我建议您为 test / controllers 文件夹中的路由创建一个测试文件。
class HomeRoutesTest < ActionController::TestCase
test "must route to home index" do
assert_routing '/', controller: "home", action: "index"
end
end
有人提到它们属于集成测试。我不同意。你只是测试它的路线。所以它更倾向于功能甚至是单元测试而不是集成测试。
中找到参考
集成测试适用于 flow ,您可以在其中测试不同控制器操作的交互,例如执行用户登录等业务流程,浏览网站并将项目放入购物篮。 这就是说如果您的路线不起作用,您的集成测试将无法运行。因此,许多人说集成测试是测试路由的地方。 但是,考虑到开发周期,在进行集成测试之前,首先要创建单元测试,控制器测试,路由测试等。
另外注意:assert_routing
同时进行了两项测试:assert_generates
和assert_recognizes
。
答案 3 :(得分:2)
根据this rails bug中的评论,正确的地方是功能测试。如果您尝试在集成测试中测试它们,则您在routes.rb
中建立的路由将不可用。
require 'test_helper'
class FooControllerTest < ActionController::TestCase
test "foo routes" do
assert_recognizes({:controller => 'foo_controller', :action => 'list'}, '/foos'
end
end
路由测试是列出野外存在的链接的好地方,并避免因代码更改而无意中破坏它们。有点奇怪的是测试的范围是控制器,因为它是你实际测试的整个路径集,但我还没有听说过'路由集测试'。
答案 4 :(得分:0)
如果您使用的是rspec,那么路由测试最自然的地方就在目录spec/routing
中。来自The Rspec documentation:
路由规范由
:type => :routing
标记,或者您已设置config.infer_spec_type_from_file_location!
将它们放在spec / routing中。