9

aws-sdk我有一些使用gem将文件上传到 Amazon S3 的代码。显然它做了一个 HTTP put 来上传文件。

有没有一种模拟 aws-sdk gem 的这个功能的好方法?

我尝试使用 Webmock,但 aws-sdk gem 似乎是get latest/meta-data/iam/security-credentials/第一个。似乎使用 Webmock 可能不是模拟此功能的最佳方式。

在 RSpec 中工作。

4

2 回答 2

17

如果您使用的是 aws-sdk gem 的第 2 版,请尝试添加:

Aws.config.update(stub_responses: true)

到你的RSpec.configure块(通常在你的rails_helper.rb文件中找到)


虽然上述方法有效,但如果您不进一步指定响应内容,它将返回空响应 - 不一定有效,但已存根。

您可以从命名操作生成并返回存根响应数据:

s3 = Aws::S3::Client.new
s3.stub_data(:list_buckets)
#=> #<struct Aws::S3::Types::ListBucketsOutput buckets=[], owner=#<struct Aws::S3::Types::Owner display_name="DisplayName", id="ID">>

除了生成默认存根之外,您还可以提供数据以应用于响应存根。

s3.stub_data(:list_buckets, buckets:[{name:'aws-sdk'}])
#=> #<struct Aws::S3::Types::ListBucketsOutput buckets=[#<struct Aws::S3::Types::Bucket name="aws-sdk", creation_date=nil>], owner=#<struct Aws::S3::Types::Owner display_name="DisplayName", id="ID">>

有关更多详细信息,请参阅:http ://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html

于 2015-11-10T14:52:52.973 回答
12

在AWS SDK for Ruby中有很多方法可以模拟请求。Trevor Rowe 最近发表了一篇关于使用 SDK 对对象存根的原生支持的文章,它不需要像 Webmock 这样的任何外部依赖项。您还可以使用VCR 之类的工具(链接会将您转到另一篇博客文章)来构建可缓存的集成测试;这样,您可以在需要准确性时针对实时服务进行测试,并在需要速度时避免访问网络。

关于 get 请求latest/meta-data/iam/security-credentials/,发生这种情况是因为 SDK 正在尝试查找凭证,如果没有提供,它将检查您是否在 EC2 实例上运行作为最后的手段,导致 SDK 发出额外的 HTTP 请求. 您可以通过简单地提供伪造的静态凭据来避免此检查,但如果您使用 VCR 之类的东西,您将需要为第一次运行提供有效的凭据。您可以在 Trevor 撰写的关于凭据管理的另一篇博文中了解如何提供静态凭据(这也应该在开发人员指南和 SDK 文档中)。

于 2013-05-05T07:10:00.297 回答