您如何使用 Fog::Compute 对象的 Rspec any_instance 存根?

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)

jef*_*nes 5

事实证明,当使用 时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)

对这个对象进行存根会导致事情按预期工作。