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

时间:2013-03-25 09:02:14

标签: ruby-on-rails rspec

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

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

2 个答案:

答案 0 :(得分:4)

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

前者会导致脆弱的测试。

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

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

修改

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

答案 1 :(得分:2)

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

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

此外,还有两点建议:

  1. 最好使用Capybara,允许使用Javascript进行网页驱动。这样,“get”将无法使用,而是使用“visit”

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

  3. 添加

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

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

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