2014-01-09 45 views
2

我正在使用RSpec測試我的視圖。由於一些變化,現在有在視圖中url_for一個電話,所有我寫了show行動是失敗的規格:正確的種子路線查看方式

No route matches {:controller=>"events", :action=>"show"} 

:id部分缺失以及由於呼叫失敗。

(我知道我可以只存根失敗的方法調用)

only thing I found是很老,看起來像一個糟糕的解決辦法。此外RSpec documentation不顯示有用的東西。

是否有正確的方法告訴RSpec它應該在events/123之類的東西上?

一些更多的上下文:

在視圖 我叫幫手,是這樣的:

def some_helper_method 
    url_for(only_path: false)} + "something_else" 
end 

該方法的調用失敗,

Failure/Error: render 
ActionView::Template::Error: 
    No route matches {:controller=>"events", :action=>"show"} 

我目前正在通過對該方法的電話進行修改來修復它view.stub(some_helper_method: 'SOME_URL')

+0

您使用的是stub_model嗎?如果是這樣,我認爲可以爲您提供正確的答案。我知道創建視圖規範的最佳做法是存根模型(包括其id部分),否則會遇到非常慢的視圖規範,這對您的測試套件來說是一個很大的缺點。 –

+0

不,我使用工廠的女孩,但如何'stub_model'幫助 – phoet

+0

如果你使用的是stub_model我會說當分配模型視圖在視圖規範,缺少的':id'將是問題的原因。通過'FactoryGirl.create',這不應該成爲問題,因爲創建後會提供'id'。你可以粘貼視圖的規範和url_for聲明嗎?我不認爲這是一個難以追查的事情,我會很樂意提供幫助;) –

回答

6

好吧,我想我找到了答案。我克隆你的回購和調試很多= P,直到我發現你需要推斷在您的視圖規範期望的參數,因爲rspec-軌道只提供:controller參數爲被渲染的視圖。那麼,試圖更好地瞭解是什麼問題,我發現這解釋了RSpec的護欄文檔中:

查看規格從路徑到視圖模板推斷控制器名稱和路徑。例如如果模板「事件/ index.html.erb」,則:

controller.controller_path == "events" controller.request.path_parameters[:controller] == "events"

這意味着,大部分的時間你不需要設置這些值。當spec'ing中包含不同的控制器部分,你可能需要渲染視圖

換句話說前覆蓋這些值,以前link,您張貼仍有效,仍是解決方案視圖規範中的參數「問題」。您可以在此PullRequest線程中關注該主題的討論。

因此,得出的結論是,如果你真的不想要你的電話存根出url_for助手(或正在調用它的助手),您需要提供所需:id參數,因爲有任何節目的路由行動沒有:id param(正如您所指出的那樣)。我們的最終結果(測試)確實是:

controller.request.path_parameters[:id] = event.id

如果這是一個解決方法嗎?我真的不這麼認爲,因爲rspec-rails本身在內部使用這個特性來提供:controller參數。

對不起,我以前沒有更多幫助,但我認爲這關閉了我們所有的主要疑慮。

我的看法?如果你真的不需要根據url_for行爲(或任何幫助者的行爲)作出任何斷言,只需將它存根,因爲它預計已經被孤立地測試過了。否則,請使用參數:id,不要擔心。它是不是解決方法。

乾杯朋友!

+1

擁有類似「describe」events/show/123「'完成整個工作! – phoet

+0

我們同意! @phoet –

-2

如果你將面對的ID問題在您的route.rb試試這個

get "events/show/:id", :to=> "events#show" 
+0

正如問題中所述,問題是因爲url_for正在爲沒有id的模型構建url。這不是路線問題。 –