我在规范中对 AWS SDK 调用使用 stub 响应,并且我始终能够 stub 带有异常的函数,然后根据情况测试它是否被适当捕获或引发。这将是迄今为止一直在工作的 MWE:
let(:aws_creds) { ::Aws::Credentials.new('a', 'b') }
let(:ec2_dummy_client) { ::Aws::EC2::Client.new(credentials: aws_creds, stub_responses: true) }
...
describe 'delete_vpc' do
it 'raises on non-existent VPC' do
ec2_dummy_client.stub_responses(:delete_vpc, Aws::EC2::Errors::InvalidVpcIDNotFound)
expect{ec2_dummy_client.delete_vpc(vpc_id: "vpc-a08b44c5")}.to raise_exception(Aws::EC2::Errors::InvalidVpcIDNotFound)
end
end
但是,自从从 AWS SDK 2.0 升级到 2.1 以来,我不断收到此(现实世界)错误:
Failure/Error: expect{ec2_dummy_client.delete_vpc(vpc_id: "vpc-a08b44c5")}.to raise_exception(Aws::EC2::Errors::InvalidVpcIDNotFound)
expected Aws::EC2::Errors::InvalidVpcIDNotFound, got #<ArgumentError: wrong number of arguments (0 for 2)> with backtrace:
# ./spec/lib/backends/ec2_backend_spec.rb:691:in `block (5 levels) in <top (required)>'
# ./spec/lib/backends/ec2_backend_spec.rb:691:in `block (4 levels) in <top (required)>'
我意识到我分配异常代替返回结构的方法一开始可能有点天真,尽管它有效。但是,正确的方法是什么?
最佳答案
事实证明,带有错误的 stub 函数是正确的方法,但 AWS 接口(interface)在 SDK v. 2.0 和 2.1 之间发生了变化。
一些错误(不是全部)现在是类 ServiceError
,其构造函数需要两个强制属性:context
和 message
。
对于一个简单的规范,只需初始化它们就足够了,这样问题中给出的 MWE 就可以像这样修复:
let(:aws_creds) { ::Aws::Credentials.new('a', 'b') }
let(:ec2_dummy_client) { ::Aws::EC2::Client.new(credentials: aws_creds, stub_responses: true) }
...
describe 'delete_vpc' do
it 'raises on non-existent VPC' do
ec2_dummy_client.stub_responses(:delete_vpc, Aws::EC2::Errors::InvalidVpcIDNotFound.new(Seahorse::Client::RequestContext.new,"VPC does not exist"))
expect{ec2_dummy_client.delete_vpc(vpc_id: "vpc-a08b44c5")}.to raise_exception(Aws::EC2::Errors::InvalidVpcIDNotFound)
end
end
请注意对 stub_responses()
调用中的 .new(...)
部分。
关于exception - stub AWS SDK 函数以返回异常(自 SDK v. 2.1 起),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30869403/