【问题标题】:Where to test routes in ruby on rails在哪里可以在 ruby​​ on rails 中测试路线
【发布时间】:2011-03-13 15:14:33
【问题描述】:

在哪里可以在 ruby​​ on rails 中测试路线?

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

加法:

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

【问题讨论】:

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


    【解决方案1】:

    路由应该作为集成测试的一部分来完成。集成测试是您测试应用程序的重要工作流程的地方 - 更具体地说,是否定义了 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 可能是您想要使用的断言。
    • 重定向的路由(没有控制器,例如,如果您将旧的 RSS 提要重定向到新的 RSS 提要 url)无法在功能测试中进行测试。它们只能是集成测试的一部分(至少如果您使用 Minitest)
    • 这个答案不应该是公认的答案。路由测试应该属于功能测试,正如 RailsGuides for Testing 中引用的那样。
    • 对于较新版本的 Rails,你的类应该继承自 ActionDispatch::IntegrationTest 而不是 ActionController::IntegrationTest
    【解决方案2】:

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

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

    【讨论】:

    • 请看补充问题。
    • 再次问自己“为什么?”您应该测试超出基本框架职责范围的应用程序部分,这些部分是潜在的故障点。如果你有一些路由需要在不同的场景下进行测试,那么使用那些路由测试助手。我可能会在功能和/或集成测试中使用它们。
    • “为什么?”是另一个问题。这是合理的,但另一个。有专门的断言,问题是在哪里使用它们?
    • 我认为在这里进行测试的重要事情(应该如此)是该路线完全存在。因此,应用程序结构正在接受测试。这样,如果有人更改了函数所依赖的路由,那么就会有一个测试来捕捉它。即,您不需要进行太多测试以使路线“有效”,只要它“存在”即可。您将单独测试它是否适用于控制器测试。因此,与往常一样,永远不需要测试......但强烈建议您依赖的应用程序越多,您的测试就应该越全面。
    • @jemminger 是的,如果路由是由标准资源定义的,我会在控制器测试中对其进行测试。但也有自定义路由的情况,例如“get '/colleagues', to: 'user#index'”。在这种情况下,我不认为控制器测试有责任测试它们。因此,正如您所建议的,集成测试是一个很好的测试场所。
    【解决方案3】:

    我建议您在 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_generatesassert_recognizes

    【讨论】:

    【解决方案4】:

    根据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
    

    路由测试是列出野外存在的链接的好地方,并避免因代码更改而无意中破坏它们。测试的范围仅限于控制器有点奇怪,因为它是您实际测试的整个路由集,但我还没有听说过“路由集测试”。

    【讨论】:

      【解决方案5】:

      如果您使用 rspec,那么路由测试最自然的位置是目录 spec/routing。来自The Rspec documentation

      路由规范由:type =&gt; :routing 标记,或者如果您已设置 config.infer_spec_type_from_file_location! 将它们放在规范/路由中。

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 2011-10-26
        • 1970-01-01
        相关资源
        最近更新 更多