我有一些使用aws-sdk gem将文件上传到亚马逊S3的代码。显然,它使用HTTP put来上传文件。
有没有一个很好的方法来模拟aws-sdk gem的这个功能?
我尝试使用Webmock,但aws-sdk gem似乎先做了一个get latest/meta-data/iam/security-credentials/。似乎使用Webmock可能不是模拟此功能的最佳方式。
在RSpec中工作。
发布于 2013-05-05 15:10:00
有很多方法可以在AWS SDK for Ruby中模拟请求。Trevor Rowe最近发表了一篇关于使用SDK对object stubbing的本机支持的文章,它不需要任何像Webmock这样的外部依赖项。你也可以使用像VCR这样的工具(链接会把你带到另一篇博客)来构建可缓存的集成测试;通过这种方式,你可以在你想要准确的时候对实时服务进行测试,并且在你想要速度的时候避免访问网络。
对于latest/meta-data/iam/security-credentials/上的get请求,这是因为SDK正在尝试查找凭据,如果没有提供凭据,它将检查您是否在EC2实例上运行作为最后手段,从而导致SDK发出额外的HTTP请求。您可以通过简单地提供虚假的静态凭据来避免此检查,但是如果您使用的是VCR之类的东西,则需要为第一次运行提供有效的凭据。您可以阅读有关如何提供静态凭据in another blog post that Trevor wrote on credential management的信息(这也应该在开发人员指南和SDK文档中提供)。
发布于 2015-11-10 22:52:53
如果您使用的是版本2的aws-sdk gem,请尝试添加:
Aws.config.update(stub_responses: true)到您的rails_helper.rb文件中的RSpec.configure块)
虽然上面的方法有效,但如果您不进一步指定响应内容,它将返回空响应-不一定有效,但已存根。
您可以从命名操作生成和返回存根响应数据:
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
https://stackoverflow.com/questions/16380426
复制相似问题