0

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

user.calendar.upcoming_events

其中“upcoming_events”是一个 api 调用。我正在为用户控制器创建测试,并且我想避免在我的测试中实际执行 API 调用。如何存根“upcoming_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

知道我出了什么问题吗?

4

3 回答 3

2

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

user.stub_chain(:calendar, :upcoming_events).and_return(...)
于 2013-07-14T00:35:48.803 回答
1
some_variable = stub :method_name => :return_value

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

也看看这个视频

于 2013-07-13T22:48:36.957 回答
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

你能分享完整的错误输出,包括堆栈跟踪吗?

于 2013-07-13T23:50:05.127 回答