如何使用rspec模拟AWS SDK(v2)?

我有一个类使用aws-sdk-rails gem (它是aws-sdk-ruby v2的包装器)从SQS队列读取/处理消息。 如何模拟AWS调用,以便我可以在不调用外部服务的情况下测试我的代码?

communicator.rb

class Communicator def consume_messages sqs_client = Aws::SQS::Client.new # consume messages until the queue is empty loop do r = sqs_client.receive_message({ queue_url: "https://sqs.region.amazonaws.com/xxxxxxxxxxxx/foo", visibility_timeout: 1, max_number_of_messages: 1 }) break if (response.message.length == 0) # process r.messages.first.body r = sqs_client.delete_message({ queue_url: "https://sqs.region.amazonaws.com/xxxxxxxxxxxx/foo", receipt_handle: r.messages.first.receipt_handle }) end end end 

我很难找到模拟AWS资源的示例。 我花了几天时间搞清楚这一点,并希望在Stack Overflow上分享我的结果以供后代使用。 我使用了rspec-mocks ( 双打和validation双打) 。 这是问题中的communicator.rb示例的示例。

communicator_spec.rb

 RSpec.describe Communicator do describe "#consume_messages" do it "can use rspec doubles & verifying doubles to mock AWS SDK calls" do sqs_client = instance_double(Aws::SQS::Client) allow(Aws::SQS::Client).to receive(:new).and_return(sqs_client) SQSResponse = Struct.new(:messages) SQSMessage = Struct.new(:body, :receipt_handle) response = SQSResponse.new([SQSMessage.new(File.read('data/expected_body.json'), "receipt_handle")]) empty_response = SQSResponse.new([]) allow(sqs_client).to receive(:receive_message). and_return(response, empty_response) allow(sqs_client).to receive(:delete_message).and_return(nil) Communicator.new.consume_messages end end end