2011-12-29 2 views
3

以下のモデル/コントローラのスペックを模擬して設定するにはどうしたらいいですか?ここでRSpecを使ったActiveRecordダイナミックファインダーのスタブ付け

いくつかの時点で場所は、それが現在のお気に入り今

@favorite = @current_user.favorites.find_by_place_id(@place.id) 

だかどうかがチェックされるモデル

class User < ActiveRecord::Base 
    has_many :favorites 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :place 
end 

class Place < ActiveRecord::Base 
    has_many :favorites, :as => :favorable 
end 

はその後、私はいくつかの例については、ユーザーを模擬したい

it "should be success" do 
    user = double("User") 
    user.stub(:favorites) 
    get :show, :id => "1081651" 
    response.should be_success 
end 

しかし、結局、

undefined method `find_by_place_id' for nil:NilClass 

私はどうすればいいですか:お気に入りのものを手伝ってください。ダイナミックファインダーが使用されているので、私はそれを正しく模倣する方法がわかりません。すべての予期しないメッセージを無視します

答えて

2

使用nullオブジェクトのスタブ、:私はそれのさまざまなバージョンからの帰国nilを試してみました

user.stub_chain(:favorites, :find_by_place_id) 
+0

user.stub(:favorites).and_return(double.as_null_object) 

もう一つの方法は、stub_chainメソッドを使用することです:お気に入りのスタブが、運がない。問題は、メソッドが期待されていないということではなく、find_by_place_idが操作できるものを返す必要があり、nilで操作できないということです。 – RyanW

+0

@ RyanW right、スタブされた 'お気に入り'メソッドからヌルオブジェクトを返そうとしています。答えを編集しました。 –

1
favorite = double('Favorite') 
user.stub_chain(:favorites, :find_by_place_id) { favorite } 
関連する問題