2016-02-26 39 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

相关问题