2017-05-25 41 views
1

我是單元測試和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

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%的魔法,你可能不應該使用它,但它在我的小測試環境中工作。

相關問題