如何在活动记录关系中存根方法

时间:2013-07-13 22:33:48

标签: ruby-on-rails rspec

我的控制器中有一行代码如下:

user.calendar.upcoming_events

其中“coming_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

知道我出错了吗?

3 个答案:

答案 0 :(得分:2)

对于这种情况,我会使用rspec的stub_chain方法。

user.stub_chain(:calendar, :upcoming_events).and_return(...)

答案 1 :(得分:1)

some_variable = stub :method_name => :return_value

无论你的方法是什么,这都会存在。

同时查看此视频Codeship

答案 2 :(得分: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

您可以共享完整的错误输出,包括堆栈跟踪吗?