【发布时间】:2011-03-13 15:14:33
【问题描述】:
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 testing routing
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 testing routing
路由应该作为集成测试的一部分来完成。集成测试是您测试应用程序的重要工作流程的地方 - 更具体地说,是否定义了 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 错误时。
【讨论】:
assert_recognizes 可能是您想要使用的断言。
ActionDispatch::IntegrationTest 而不是 ActionController::IntegrationTest
您为什么觉得有必要测试路线?纯粹是为了确保您的 routes.rb 中定义的路线确实有效?如果是这样,那就不要。这不是您的应用程序测试的工作,以确保框架的内部正常运行 - 这是 Rails 框架自己的测试的工作。
如果您想测试某种动态/用户可定义的路线,我可能会选择集成。
【讨论】:
我建议您在 test/controllers 文件夹中为路由创建一个测试文件。
class HomeRoutesTest < ActionController::TestCase
test "must route to home index" do
assert_routing '/', controller: "home", action: "index"
end
end
提到它们属于集成测试。我不同意。您只是测试路线,仅此而已。所以它宁愿落入功能测试甚至单元测试,而不是集成测试。
您可以在 Rails 中找到参考RailsGuide Testing, section 9. Testing Routes
集成测试适用于流程,您可以在其中测试不同控制器操作的交互,例如执行业务流程,例如用户登录、浏览网站并将商品放入购物篮。 也就是说,如果您的路线不起作用,您的集成测试将不起作用。因此,许多人说集成测试是您测试路由的地方。 但是,考虑到开发周期,您需要先创建单元测试、控制器测试、路由测试等,然后再进行集成测试。
另外一点:assert_routing 进行了两个测试:assert_generates 和 assert_recognizes。
【讨论】:
根据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
路由测试是列出野外存在的链接的好地方,并避免因代码更改而无意中破坏它们。测试的范围仅限于控制器有点奇怪,因为它是您实际测试的整个路由集,但我还没有听说过“路由集测试”。
【讨论】:
如果您使用 rspec,那么路由测试最自然的位置是目录 spec/routing。来自The Rspec documentation:
路由规范由
:type => :routing标记,或者如果您已设置config.infer_spec_type_from_file_location!将它们放在规范/路由中。
【讨论】: