是否仍然建议使用Minitest测试Rails 4中的路由?

pdo*_*obb 6 ruby ruby-on-rails minitest ruby-on-rails-4

在Rails 3中,当在MiniTest中编写功能测试时,我养成了测试路由与测试控制器操作分开的习惯.我从Rails指南测试中得到了这个想法- 第9节:测试路径.但是,在将我的应用程序升级到Rails 4之后,我注意到如果我没有为get|patch|post|delete方法提供一组适当的参数,那么控制器动作测试本身已经开始涉及未知路由.

例如,给定路线:

# config/routes.rb
namespace "api" do
  namespace "v2", defaults: { format: :json } do
    resources :users do
      resources :posts do
        resources :comments
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

和功能测试:

# test/controllers/api/v2/comments_controller_test.rb
describe Api::V2::CommentsController
  it "does something" do
    get :index
  end
end
Run Code Online (Sandbox Code Playgroud)

在Rails 3中,上述方法可行.但在Rails 4中,我收到了URL生成错误:

ActionController :: UrlGenerationError:没有路由匹配{:action =>"index",:controller =>"api/v2/comments"}

从这里我可以推断,get当试图找到控制器和动作时,帮助器根本无法匹配路由文件中的路由.很公平.我可以通过更改get调用来解决这个问题,以包含满足嵌套路由所需的参数,如下所示:

# test/controllers/api/v2/comments_controller_test.rb
describe Api::V2::CommentsController
  it "does something" do
    get :index, { user_id: "1", post_id: "1" }
  end
end
Run Code Online (Sandbox Code Playgroud)

......然后一切都很好.

所以我的问题是,因为在Rails 3中并非如此,现在可以信任控制器动作测试来完全测试/验证我在Rails 4+中的路由吗?或者在测试路线方面还有其他优势吗?或许还有一些其他角度,路线测试涵盖了控制器动作测试未涵盖的范围?(注意:我不是要求对测试有什么好处的意见;我要求路由集成测试和控制器动作测试之间在路由要求方面的功能差异.)

此外,我无法在Rails 4发行说明(或Minitest)中找到对此行为更改的具体引用,因此我想知道为什么首先进行此行为更改.我认为这不是一件坏事 - 我认为这很好 - 但是我觉得很奇怪没有在某个地方的变更日志中看到它.而且我认为这些方法的一半要点get|patch|post|delete是让你不必考虑首先需要哪些参数进行路由.

为了完整性,这里是我将用于此的路由测试:

describe "CommentsController Route Integration Test" do
  let(:default_options) {
    { controller: "api/v2/comments",
      user_id: "1",
      posts_id: "1",
      format: :json }
  }

  it "#index" do
    assert_routing "/api/v2/users/1/posts/1/comments",
                   default_options.merge(action: "index")
  end
end
Run Code Online (Sandbox Code Playgroud)

UPDATE

我一直在寻找ActionDispatch代码以获得答案...到目前为止,我唯一能看到的是url_for自Rails 3以来已经发生了很大的变化,并且在Rails 4中添加了ActionController :: UrlGenerationError类本身.所以可能是这些新的,更严格的路由要求是ActionView和ActionController解耦的偶然变化.

pdo*_*obb 2

最近为一些新控制器编写了功能测试后,在没有编写任何路由集成测试的情况下,我相当有信心测试路由的额外工作是多余的。也就是说,如果有覆盖所有路由的功能测试。

我的推理基本上是......在任何情况下,如果我get|patch|post|delete向控制器操作的调用提供了不正确的参数,它总是会失败。每当我为存在但缺少相应路由的控制器操作编写测试时,它总是会失败。因此,似乎较高级别的功能测试也可以很好地执行较低级别的路由集成测试 - 那么为什么要费心重复工作呢!

我想我将来仍然会寻找关于此的更新的“官方”词,但现在我决定不再担心只要存在重叠的功能测试就直接测试我的路线。

更新

我进一步认为测试 API 路由可能仍然有用。这有助于确保使用 API 发布的实际 URL字符串实际上是正确且有效的。请注意,测试字符串而不是命名路由很重要,因为命名路由可能会随着路由文件中资源的更改而更改。