如何在chefspec中模拟一个用另一个类扩展的对象实例的函数调用

时间:2017-05-25 13:10:51

标签: unit-testing chef chefspec

我是单位测试和chefspec的新手。我试图模拟/拦截来自依赖库的配方中的函数调用

  • module Helper
      def do_something_useful
        return "http://example.com/file.txt"
      end
    end
    
  • 配方

    remote_file '/save/file/here' do
      extend Helper
      source do_something_useful
    end
    

我尝试了以下内容:

  • Chefspec

    allow_any_instance_of(Chef::Resource::RemoteFile).to receive(:do_something_useful).and_return('foobar')
    allow_any_instance_of(Chef::Resource).to receive(:do_something_useful).and_return('foobar')
    

    我也试过用双人模仿:

    helper = double
    Helper.stub(:new).and_return(helper)
    allow(helper).to receive(:do_something_useful).and_return('foobar')
    

    此操作因uninitialized constant Helper

  • 而失败

1 个答案:

答案 0 :(得分:1)

Sooooo这是一个有趣的案例,extend正在覆盖模拟方法。所以我们可以使用extend来推动事情:

before do
  allow_any_instance_of(Chef::Resource::RemoteFile).to receive(:extend) do |this, m|
    Module.instance_method(:extend).bind(this).call(m)
    allow(this).to receive(:do_something_useful).and_return('foobar')
  end
end

这就像800%的魔力,你可能不应该使用它,但它确实可以在我的小测试环境中使用。