jef*_*nes 2 ruby rspec stub fog
尝试存根Fog::Compute对象的方法,如下所示:
describe EtHaproxy::Helpers do
let(:helpers) { Object.new.extend(EtHaproxy::Helpers) }
before do
Fog.mock!
Fog::Mock.reset
@fog_conn = Fog::Compute.new(
provider: 'AWS',
aws_access_key_id: 'MOCK_ACCESS_KEY',
aws_secret_access_key: 'MOCK_SECRET_KEY'
)
@fog_conn.data[:limits][:addresses] = 25
2.times do
@fog_conn.allocate_address('vpc')
end
@mock_eips = @fog_conn.addresses.map { |a| a.public_ip }
Fog::Compute.any_instance.stub(:addresses).and_return(@fog_conn.addresses)
end
describe 'any_instance.stub' do
it 'returns the specified value on any instance of the class' do
o = Fog::Compute.new(
provider: 'AWS',
aws_access_key_id: 'MOCK_ACCESS_KEY',
aws_secret_access_key: 'MOCK_SECRET_KEY'
)
o.addresses.should eq(@fog_conn.addresses)
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,在运行此示例规范测试(从Rspec 2.14 的 Relish 文档中提取)时,它失败了,说明:
Failure/Error: Fog::Compute.any_instance.stub(:foo).and_return(:return_value)
NoMethodError:
undefined method `any_instance' for Fog::Compute:Module
Run Code Online (Sandbox Code Playgroud)
事实证明,当使用 时Fog.Mock!,Fog 创建了一个便利层,您实际上并没有处理Fog::Compute,而是我们以Fog::Compute::AWS::Mock. 因此,要存根该方法,我们需要这样做:
Fog::Compute::AWS::Mock.any_instance.stub(:addresses).and_return(@fog_conn.addresses)
Run Code Online (Sandbox Code Playgroud)
对这个对象进行存根会导致事情按预期工作。