這些中的哪一個是編寫集成(請求)測試的「正確」方式。在集成測試中使用命名路由是否合適?
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驅動程序。這樣,「get」將不起作用,而是使用「visit」
無需檢查集成測試中的響應,這是功能測試(控制器)的工作。直接轉到真正的觀點。
添加
要回答Jason的問題。是的,我始終在集成測試中始終使用硬編碼路線。
原因是外部進場方法,這是驗收測試驅動開發的關鍵點。當我編寫集成測試時,我不知道指定的路由,因爲routes.rb尚未修改。或者我應該知道,但我不在乎那一刻。
當rspec告訴我「沒有匹配的路線」時,我說,很好,讓我生成控制器並檢查routes.rb。
我認爲在你的應用程序代碼和測試代碼之間保持一致是一個好主意,所以我會說在兩者中都使用兩個命名路由或不命名路由。由於Rails似乎希望您在硬編碼路徑上使用命名路由,所以我會說在兩個地方都使用命名路由。 – 2013-03-25 13:39:31
@JasonSwett,謝謝你的觀點:)我在回答中加入了我的觀點。 – 2013-03-25 13:47:36
有趣的一點。我現在不太確定我的立場是否正確。 – 2013-03-25 13:50:37
我同意命名路線是要走的路,但也許有一個稍微不同的原因。我會說你的應用程序代碼的白話應該與你的測試代碼的白話匹配。由於Rails希望您在應用程序中使用命名路由,因此在我看來,在測試中使用命名路由是合乎邏輯的。 – 2013-03-25 13:36:32