我怎样才能模拟一个方法只对一个对象 return 一次? (我正在测试分页光标)

How can I get mock a method to only return an object once? (I am testing a pagination cursor)

我想return一个next_cursor一次。这段代码现在让我在测试时陷入无限循环:

slack_client = double('slack_client')
slack_response = OpenStruct.new(response_metadata: OpenStruct.new(next_cursor: 'page-2'))
expect(slack_client).to receive(:users_list).and_return(slack_response)

实际的 Slack 方法如下所示:

next_cursor = nil
loop do
    users_list_response = slack_client.users_list(cursor: next_cursor)

    # do real work in here...

    next_cursor = users_list_response.try(:response_metadata).try(:next_cursor)
    break if next_cursor.blank?
end

提供不同的参数作为模拟的一部分:

expect(slack_client).to receive(:users_list).with(cursor: nil).and_return(slack_response_page_1)
expect(slack_client).to receive(:users_list).with(cursor: 'page-2').and_return(slack_response_page_2)