【发布时间】:2014-04-10 10:11:26
【问题描述】:
我正在编写一个简单的应用程序,它允许我搜索和检索有关我的 AWS 使用情况的数据。我正在使用 Ruby aws-sdk gem 连接到 AWS。
进入我可以查询 AWS 的阶段的过程是 2 个阶段:
1) 建立连接:
AWS.config({access_key_id: 'REDACTED', secret_access_key_id: 'REDACTED', region: 'eu-west-1'})
这会返回一个AWS::Core::Configuration 对象。
2) 获取我要查询的 AWS 资源的对象:
ec2 = AWS::EC2.new(:ec2_endpoint => 'ec2.eu-west-1.amazonaws.com')
现在我可以获取数据了...
我希望能够编写对来自 AWS 的数据进行操作的单元测试。显然我不想每次都调用 AWS……所以我想创建一个测试替身来代替 AWS。我知道该怎么做:
describe AwsThing do
it 'gets images' do
amis = OpenStruct.new
ec2 = double('ec2-api')
ec2.should_receive(:images}.and_return amis
expect(subject.find_image(ec2, 'handy-tag')).to eql 'an-ami-that-I-tagged'
end
end
所以AwsThing#find_image方法使用了ec2 mock,我可以测试那个方法的逻辑。都很好。
但是,我还想测试获得该 ec2 连接的过程 - 上面的两个步骤。我想我希望能够编写这样的测试:
it 'gets an AWS API connection' do
expect(subject.connect(access_key, secret_key, region).to be_a AWS::Core::Configuration
end
如果我调用真正的 API,那效果很好。但我想模拟一下......所以我有测试连接方法,access_key和区域等等被传入。即我希望能够断言模拟配置对象是用正确的键调用的等等
我看不到如何执行此操作...因为似乎我无法传入模拟对象...而且我也看不到如何在被测类上模拟该方法。在这个阶段我的理解崩溃了......帮助!
【问题讨论】:
-
这可能有助于通过 RSpec 双打模拟外部 AWS 调用:stackoverflow.com/questions/33557451/…
标签: ruby rspec mocking aws-sdk