【问题标题】:How to mock connection to external service如何模拟与外部服务的连接
【发布时间】: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和区域等等被传入。即我希望能够断言模拟配置对象是用正确的键调用的等等

我看不到如何执行此操作...因为似乎我无法传入模拟对象...而且我也看不到如何在被测类上模拟该方法。在这个阶段我的理解崩溃了......帮助!

【问题讨论】:

标签: ruby rspec mocking aws-sdk


【解决方案1】:

我不知道你为什么要测试它。此功能由您正在使用的 aws-sdk gem 提供。它们具有广泛的测试覆盖率,并确保您尝试测试的内容确实有效。如果您对他们的做法感兴趣,请查看 github.com 上的源代码https://github.com/aws/aws-sdk-ruby/tree/master/spec

您应该只测试您自己实际编写的代码和一个集成测试,以确保一切都能很好地协同工作。集成测试几乎就是您已经拥有的。还是我在这里遗漏了什么?

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2017-09-26
    • 2021-10-12
    • 1970-01-01
    • 2012-02-01
    • 2019-09-30
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多