如何使用 rspec 模拟 AWS SDK (v2)?
How do I mock AWS SDK (v2) with rspec?
我有一个 class reads/processes 来自 SQS 队列的消息,使用 the aws-sdk-rails gem (which is a wrapper on aws-sdk-ruby v2)。如何模拟 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 (doubles & verifying doubles)。这是问题中 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
AWS SDK 已经提供存根。 q.v。 http://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html 了解更多信息(链接到官方文档。)
我有一个 class reads/processes 来自 SQS 队列的消息,使用 the aws-sdk-rails gem (which is a wrapper on aws-sdk-ruby v2)。如何模拟 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 (doubles & verifying doubles)。这是问题中 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
AWS SDK 已经提供存根。 q.v。 http://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html 了解更多信息(链接到官方文档。)