2

我是单元测试和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
    

我尝试了以下方法:

  • 厨师规格

    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

4

1 回答 1

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% 的魔法,你可能不应该使用它,但它在我的小测试环境中确实有效。

于 2017-05-25T19:52:16.483 回答