在Rails 3中,当在MiniTest中编写功能测试时,我养成了测试路径与测试控制器操作分开的习惯。我从Rails Guide on Testing - Section 9: Testing Routes得到了这个想法。但是,在将我的应用程序升级到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
功能测试:
# test/controllers/api/v2/comments_controller_test.rb
describe Api::V2::CommentsController
it "does something" do
get :index
end
end
在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
......然后一切都很好。
所以我的问题是,因为在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
我一直在查看ActionDispatch代码以获得答案...到目前为止我唯一可以看到的是{RES 3之后url_for
内容发生了很大的变化以及ActionController :: UrlGenerationError在Rails 4中添加了类本身。因此,这些新的,更严格的路由要求可能是ActionView和ActionController解耦的偶然变化。
答案 0 :(得分:2)
我相信,鉴于您有功能测试,测试路由和控制器是完全没必要的。这不能直接回答你的问题,但它应该可以解决你的困境。我建议对各种测试理念进行一些阅读,并(进一步)制定关于测试方法和测试内容的思想观点。
答案 1 :(得分:2)
在最近编写了几个新控制器的功能测试之后,没有编写任何路由集成测试,我相信测试路由的额外工作是过度的。鉴于,如果有功能测试涵盖所有路线。
我的理由基本上就是......在任何情况下我都会向get|patch|post|delete
调用控制器动作提供不正确的参数,它总是失败的。每当我为存在的控制器动作编写测试但缺少相应的路径时,它总是会失败。所以看来,更高级别的功能测试也可以很好地运行较低级别的路由集成测试 - 所以为什么还要重复工作呢!
我想我将来还会继续寻找一个更新的“官方”字样,但是现在我决定不再担心在存在重叠功能测试的情况下直接测试我的路线。
我进一步认为测试API路线可能仍然有用。这有助于确保使用API发布的实际URL 字符串实际上是正确且有效的。请注意,测试字符串而不是命名路由非常重要,因为命名路由可以随路由文件中资源的更改而更改。