2

其中哪一种是编写集成(请求)测试的“正确”方式。

it "should be successful" do
  get "/about/terms"
  response.should be_success
end

it "should be successful" do
  get about_terms_path
  response.should be_success
end
4

2 回答 2

4

about_terms_path是正确的,因为自定义路由路径可能会在路由文件中更改,但路由名称应保持不变。

前者会导致脆弱的测试。

如果路由名称更改,Rails 应用程序中对该路由的所有引用都需要更改,您的 rspec 测试也需要更改。

如果路由的路径发生了变化,那么 Rails 应用程序或 rspec 测试中的任何内容都不需要更改。

编辑:

如果您想测试路线,请查看https://www.relishapp.com/rspec/rspec-rails/docs/routing-specs

于 2013-03-25T10:11:39.827 回答
2

我会说任何一个都可以,我个人更喜欢第一个。

集成测试是模仿人的眼睛和动作。人类可以看到“/about/terms”,但看不到“about_term_path”。

此外,还有两个建议:

  1. 最好使用允许带有 Javascript 的 Web 驱动程序的 Capybara。这样,“get”就行不通了,改用“visit”

  2. 无需在集成测试中检查响应,这是功能测试(控制器)的工作。直接进入真正的点。

添加

回答杰森的问题。是的,我总是在集成测试中使用硬编码路由,非常一致。

原因是由外向内的方法,这是验收测试驱动开发的关键。当我编写集成测试时,我不知道命名路由,因为 routes.rb 尚未修改。或者我应该知道,但那一刻我不在乎。

当 rspec 告诉我“没有匹配的路由”时,我说,很好,让我生成控制器并检查 routes.rb。

于 2013-03-25T13:24:09.813 回答