在集成测试中使用命名路由是否合适?

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

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 

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

前者会导致脆弱的测试。

如果路由的名称发生了变化,那么Rails应用程序中对该路由的所有引用都需要更改,因此您的rspec测试也是如此。

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

编辑:

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

我会说两者都没关系,我个人更喜欢第一个。

整合测试是模仿人的眼睛和行动。 人类可以看到“/ about / terms”,但不能看到“about_term_path”。

另外,有两点建议:

  1. 最好使用Capybara,允许使用Javascript的Web驱动程序。 这样,“get”将无效,相反,使用“visit”

  2. 无需在集成测试中检查响应,这是function测试(控制器)的工作。 直接转到真实点。

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

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

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