2011-12-29 51 views
3

如何在我的控制器規格中設置以下模型/嘲笑模擬。用RSpec搗動ActiveRecord動態查找器

下面是模型

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 

然後在某個點的位置將被檢查,看它是否是目前最喜歡的

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

現在,我想嘲笑的一些例子,用戶

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

使用空對象存根,它會不顧一切意外消息:

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

另一種方法是使用stub_chain方法:

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

我嘗試了各種版本,並從返回nil :最喜歡的存根,但沒有運氣。問題不是該方法不是預期的,而是它需要返回find_by_place_id可以操作的東西,並且它不能在零上操作。 – RyanW 2011-12-29 15:13:57

+0

@RyanW正確,嘗試從stubbed'favorites'方法返回空對象。編輯答案。 – 2011-12-29 15:50:05

1
favorite = double('Favorite') 
user.stub_chain(:favorites, :find_by_place_id) { favorite }