其中哪一种是编写集成(请求)测试的“正确”方式。
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
其中哪一种是编写集成(请求)测试的“正确”方式。
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”。
此外,还有两个建议:
最好使用允许带有 Javascript 的 Web 驱动程序的 Capybara。这样,“get”就行不通了,改用“visit”
无需在集成测试中检查响应,这是功能测试(控制器)的工作。直接进入真正的点。
添加
回答杰森的问题。是的,我总是在集成测试中使用硬编码路由,非常一致。
原因是由外向内的方法,这是验收测试驱动开发的关键。当我编写集成测试时,我不知道命名路由,因为 routes.rb 尚未修改。或者我应该知道,但那一刻我不在乎。
当 rspec 告诉我“没有匹配的路由”时,我说,很好,让我生成控制器并检查 routes.rb。