在轨道上测试红宝石路线的位置

时间:2011-03-13 15:14:33

标签: ruby-on-rails ruby-on-rails-3 testing routing

在轨道上用红宝石测试路线的位置?

  • 单元测试?
  • 功能测试?
  • 集成测试?

增加:

确切地说,在哪里应用描述on guideson api的断言?

5 个答案:

答案 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

有人提到它们属于集成测试。我不同意。你只是测试它的路线。所以它更倾向于功能甚至是单元测试而不是集成测试。

  

您可以在Rails RailsGuide Testing, section 9. Testing Routes

中找到参考

集成测试适用于 flow ,您可以在其中测试不同控制器操作的交互,例如执行用户登录等业务流程,浏览网站并将项目放入购物篮。 这就是说如果您的路线不起作用,您的集成测试将无法运行。因此,许多人说集成测试是测试路由的地方。 但是,考虑到开发周期,在进行集成测试之前,首先要创建单元测试,控制器测试,路由测试等。

另外注意:assert_routing同时进行了两项测试:assert_generatesassert_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中。