RSpec 在循环中存根相同的方法

RSpec Stub same method in loop

使用 RSpec,我想:

expect(Thing).to receive(:status)
                .with(for: 'something')
                .and_return('down')

在第一次迭代中,同一个存根在第二次迭代中应该 return 不同 return:

expect(Thing).to receive(:status)
                .with(for: 'something')
                .and_return('up')

测试以下代码片段时:

2.times do |i|
  break if Thing.status(for: 'something') == 'up'
  sleep 2
  raise MyError if i > 0
end

我该怎么做?

只需存根一次并提供 all the return values

expect(Thing).to receive(:status)
                .with(for: 'something')
                .and_return('down', 'up')

第一次调用 status 时,它将 return 'down'。第二次它将 return 'up'.

您可以在存根 rspec 方法调用时指定多个 return 值

https://relishapp.com/rspec/rspec-mocks/docs/configuring-responses/returning-a-value#specify-different-return-values-for-multiple-calls