如何模拟与外部服务的连接

时间:2014-04-10 10:11:27

标签: ruby rspec mocking aws-sdk

我正在编写一个简单的应用程序,它允许我搜索和检索有关我的AWS使用情况的数据。我正在使用Ruby aws-sdk gem来获取与AWS的连接。

进入我可以查询AWS的阶段的过程是两个阶段:

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,那可行。但是我想要嘲笑那个......所以我对connect方法,access_key和region等进行了测试。也就是说我希望能够断言用正确的键调用了mock配置对象等

我无法看到如何做到这一点......因为我似乎无法传递一个模拟对象...而且我也看不出如何在被测试的类上模拟该方法。在这个阶段,我的理解打破了......帮助!

1 个答案:

答案 0 :(得分:1)

我不知道你为什么要测试它。此功能由您使用的aws-sdk gem提供。他们有广泛的测试覆盖率,并确保您尝试测试,实际上工作。如果您对他们的工作方式感兴趣,请查看github.com https://github.com/aws/aws-sdk-ruby/tree/master/spec

上的来源

你应该只测试你自己编写的代码和集成测试,一切都很好。集成测试几乎就是你已经拥有的。或者我在这里遗漏了什么?