2016-02-26 46 views
0

我有一個使用我的食譜依賴關係之一的輔助函數庫的警衛。當我創建了這個電話我試運行期間收到以下錯誤存根:依賴食譜的「未初始化的常量」

uninitialized constant Chef::Acme 

存根:

before(:each) do 
    allow(Chef::Acme::Helper).to receive(:is_widget_requested?).and_return(true) 
end 

我的依賴都在我的元數據文件,我需要「chefspec/berkshelf」寶石在我的spec_helper文件中。

處理這個問題的最佳方法是什麼?

回答

0

經過進一步測試,我發現了一個更好的解決方案。由於這樣出色的巴特勒·蘭普森在1972年指出:

「所有的計算機科學問題可以通過 間接的另一個層面來解決」我創造的食譜我的庫文件夾的包裝測試只需調用原始庫,然後我可以對庫調用進行存根。這種抽象類型是測試其他平臺的常見模式。

打包機:

class Chef 
    class Acme 
     class HelperWrapper 
      public 
       def self.is_widget_requested?(node) 
        Chef::Acme::Helper.is_widget_requested?(node) 
       end 
     end unless defined?(HelperWrapper) 
    end 
end 

不知道爲什麼,但unless defined?需要這個工作。

TEST:

before(:each) do 
    allow(Chef::Acme::HelperWrapper).to receive(:is_widget_requested?).and_return(true) 
end 
1

沒有什麼好的選擇。你的食譜庫代碼實際上並沒有加載,直到跑步者收斂,所以在執行你的庫文件實際上並沒有加載。一種選擇是使用require_relative強制它加載,儘管這可能具有各種奇怪的副作用。我的解決方案是將核心選項移動到寶石上(通過Halite),這樣我就可以使用普通的Ruby代碼加載規則。

+0

,如果你對其中c​​hefspec/berkshelf加載依賴的臨時文件夾使用require_relative什麼?你如何找到臨時目錄? – chief7

+0

你不能這樣做,因爲它現在還不存在,因爲無論如何,這些問題將與'require_relative'../ libraries/default.rb''相同。 – coderanger

+0

那麼令人失望。好吧。謝謝! – chief7