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

Ant*_*kov 17 testing routing ruby-on-rails ruby-on-rails-3

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

  • 单元测试?
  • 功能测试?
  • 整合测试?

加成:

确切地说,在哪里应用指南api上描述的断言?

Gav*_*ler 15

路由应作为集成测试的一部分完成.集成测试是测试应用程序的重要工作流程的地方 - 更具体地说,是否定义了URL似乎是一个重要的工作流程.

您的集成测试看起来像任何正常的集成测试:

# /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
Run Code Online (Sandbox Code Playgroud)

至于@jemminger没有测试路线的反应 - 虽然铁路公司的测试验证了routes.rb是否有效,但铁路公司没有责任测试是否http://yoursite.com/users在您的路线中定义.需要注意的是,大多数路由测试可以在现有的集成测试中完成,因此路由的特定测试可能是多余的.

我能想到的具体用例是已经或将要从Rails 2升级到Rails 3的所有人.定义路由的代码已经发生了重大变化,最好从测试中发现路由已经升级正确,而不是用户报告404错误时.

  • 这个答案不应该是公认的答案.路由测试应属于功能测试,如RailsGuides for Testing中所述. (2认同)
  • 对于较新版本的Rails,您的类应该继承自`ActionDispatch :: IntegrationTest`而不是`ActionController :: IntegrationTest` (2认同)

jem*_*ger 10

为什么你觉得需要测试路线?纯粹是为了确保routes.rb中定义的路由确实有用吗?如果是这样,那就不要了.这不是应用程序测试的工作,以确保框架的内部运行正常 - 这是Rails框架自己的测试的工作.

如果您想要测试某种动态/用户可定​​义的路由,我可能会选择集成.

  • 我认为在这里测试的重要事情(应该是这样)是路线存在的.因此应用程序结构正在接受测试.这样,如果有人改变了一个函数依赖的路由,那么就有一个测试可以捕获它.也就是说,你不需要进行太多的测试,以至于路线"正常"只是"存在".您将单独测试它是否与控制器测试"一致".因此,永远不需要测试...但强烈建议您依赖的应用程序越多,您的测试应该越全面. (4认同)
  • “为什么?” 是另一个问题。这是合理的,但又是另一回事。有专门的断言,问题是**在哪里使用它们?** (2认同)

Ely*_*Ely 6

我建议你为test/controllers文件夹中的路由创建一个测试文件.

class HomeRoutesTest < ActionController::TestCase

  test "must route to home index" do
    assert_routing '/', controller: "home", action: "index"
  end

end
Run Code Online (Sandbox Code Playgroud)

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

您可以在Rails RailsGuide测试的第9节中找到参考.测试路由

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

而另一方面说明:assert_routing两种测试都是:assert_generatesassert_recognizes.