2013-05-05 60 views
6

我有一些代碼使用aws-sdk gem將文件上傳到Amazon S3。顯然它做了一個HTTP put來上傳文件。如何模擬aws-sdk寶石?

有沒有一種很好的方法來模擬aws-sdk gem的這個功能?

我試過使用WebMock,但aws-sdk gem似乎先做了get latest/meta-data/iam/security-credentials/。看來使用Webmock可能不是嘲笑這個功能的最好方法。

在RSpec中工作。

回答

11

有很多方法可以模擬AWS SDK for Ruby中的請求。 Trevor Rowe最近發佈了一篇關於使用SDK的本地支持object stubbing的文章,該文章不需要像Webmock那樣的任何外部依賴。您還可以使用像VCR這樣的工具(鏈接會將您發送到其他博客文章)來構建可緩存的集成測試;這樣,您可以在需要準確性時對現場服務進行測試,並避免在想要速度時觸及網絡。

關於latest/meta-data/iam/security-credentials/上的獲取請求,發生這種情況是因爲SDK正在嘗試查找憑據,並且如果沒有提供證書,它將檢查您是否作爲最後的手段在EC2實例上運行,從而導致SDK創建一個額外的HTTP請求。您可以通過簡單地提供僞造的靜態憑證來避免此項檢查,但如果您使用的是VCR之類的東西,則需要爲第一次運行提供有效的憑證。您可以閱讀如何提供靜態憑據in another blog post that Trevor wrote on credential management(這也應該在開發人員指南和SDK文檔中)。

+0

這是非常有幫助的。錄像機看起來是一個不錯的選擇,因爲它提供了兩全其美的優點:快速測試***和***整合。 – 2013-05-05 17:54:50

+0

這並不意味着我的有效憑證的副本將存儲在VCR文件中的某個地方,這些文件最終可能會在CVS中提交? – 2014-05-30 07:18:48

+1

@FabrizioRegini您可以過濾掉來自VCR盒子的敏感數據:https://relishapp.com/vcr/vcr/v/2-9-2/docs/configuration/filter-sensitive-data – David 2014-08-05 13:25:20

14

如果您正在使用AWS-SDK寶石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