使用不同的参数调用double instance_method

时间:2015-09-28 20:06:01

标签: ruby rspec

我正在测试一些调用aws-sdk(v2)的代码。许多方法通过在返回值中设置is_truncated属性来进行分页。然后在返回中使用其他值(通常为marker)并将其传递给下一个调用。因此,用法通常类似于:

values = []
rv = client.do_thing
values.concat rv.things
while rv.is_truncated
    rv = client.do_thing(next_marker: rv.marker)
    values.concat rv.things
end

我的问题是 - 我想instance_double AWS客户端。但是,我无法找到一种说法"期望第一次调用没有参数并返回this。然后,第二个调用将包含these个参数并返回that。"我知道我可以通过将两个预期rv&#39置于同一个and_returns()调用中来设置两个调用的返回值。但是,我想测试第一个marker中的rv是否会在下次调用中作为next_marker传递。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以在RSpec mocks中使用Message Order功能:

RSpec.describe "Constraining order" do
  it "passes when the messages are received in declared order" do
    collaborator_1 = double("Collaborator 1")
    collaborator_2 = double("Collaborator 2")

    expect(collaborator_1).to receive(:step_1).ordered
    expect(collaborator_2).to receive(:step_2).ordered
    expect(collaborator_1).to receive(:step_3).ordered

    collaborator_1.step_1
    collaborator_2.step_2
    collaborator_1.step_3
  end
end