2016-03-08 41 views
0

我在寫一篇RSpec的測試,並需要允許選址模型以下行:RSpec的允許在那裏(ID:添加my_id)。首先

Location.where(id: params[:id]).first 

但是,這是不正確的(兩個參數,而不是一個錯誤):

allow(Location).to receive(:where, :first).with(id: my_id) 

所以是這樣的:

allow(Location).to receive(:where).with(id: my_id).first 

這將是這樣做的正確方法?

+1

如果將代碼更改爲'Location.find_by(id:params [:id])' – BroiSatse

回答

3

因爲它是你可以做:

allow(Location).to receive(:where).with(id: my_id).and_return double(first: <your Location mock here>) 
+0

,那麼這會更容易。謝謝@BroiSatse – ntonnelier

0

where返回的關係(可枚舉類型或集合)。所以,如果你想嘲笑你在哪裏,你需要回到某種形式的集合:

allow(Location).to receive(:where).with(id: my_id).and_return([double('result')])

這就是說,你可以隨時更換其中(...)的模式首先與find_by(。 ..):

Location.find_by(id: params[:id]) 
allow(Location).to receive(:find_by).with(id: my_id).and_return(double('result')) 

這樣,您不需要返回一個集合,以便您可以先調用它。你立即得到第一個結果。

如果你實在無法修改代碼,也不能修改的結果 - 你基本上只是想允許特定的合同 - 那麼你可以去message_chains如在Working with legacy code section描述:

allow(Location).to receive_message_chain(:where, :first) 
+0

傳遞給double的字符串旨在成爲doubled對象的類名。它用於檢查使用散列傳遞給double的方法是否確實在該類上定義。如果沒有用該名稱定義的類來允許更好的測試隔離,它什麼也不做。 – BroiSatse