0

我有一个守卫,它使用来自我的食谱依赖项之一的帮助程序库。当我为此调用创建存根时,我在测试运行期间收到以下错误:

uninitialized constant Chef::Acme

存根:

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

我的依赖项在我的元数据文件中,我需要在我的 spec_helper 文件中使用“chefspec/berkshelf”gem。

处理这个问题的最佳方法是什么?

4

2 回答 2

1

真的没有什么好的选择。在运行程序收敛之前,您的食谱库代码不会实际加载,因此在执行时您的库文件实际上并没有加载。一种选择是require_relative强制它提前加载,尽管这可能会产生各种奇怪的副作用。我的解决方案是“核选项”将我所有的食谱移动到 gems(通过 Halite),这样我就可以使用普通的 Ruby 代码加载规则。

于 2016-02-26T19:33:20.673 回答
0

经过进一步测试,我找到了更好的解决方案。正如巴特勒·兰普森(Butler Lampson)在 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?是工作所必需的。

测试:

before(:each) do
    allow(Chef::Acme::HelperWrapper).to receive(:is_widget_requested?).and_return(true)
end
于 2016-02-26T23:05:06.933 回答