2013-07-13 145 views
0

我有我的控制器中的一行代碼,看起來像這樣存根方法:如何主動記錄關係

user.calendar.upcoming_events 

其中「upcoming_events」是一個API調用。我正在爲用戶控制器創建測試,並且我希望避免在測試中實際執行API調用。如何將「coming_events」存檔?

我一直希望這會奏效,但到目前爲止它還沒有。

let(:calendar) { double(:calendar, upcoming_events: []) } 
before 
    user.stub(:calendar).and_return(calendar) 
    sign_in user 
end 

get :index 

it { response.should be_success } 

這將引發

NoMethodError: 
    undefined method `upcoming_events' for nil:NilClass 

任何想法,我什麼都錯了嗎?

回答

2

對於這種情況,我會使用rspec的stub_chain方法。

user.stub_chain(:calendar, :upcoming_events).and_return(...) 
1
some_variable = stub :method_name => :return_value 

無論你的方法是什麼,這存根。

看看這個視頻太Codeship

0

有什麼不對您的特定rspec的要求本身的組合的,如下面將成功:

describe 'rspec test' do 
    user = Object.new 
    let(:calendar) { double(:calendar, upcoming_events: []) } 
    before { user.stub(:calendar).and_return(calendar) } 
    it { expect(user.calendar.upcoming_events).to eq([]) } 
end 

你能分享完整的錯誤輸出,包括堆棧跟蹤?