我收到错误
NoMethodError
-------------
undefined method `registry_key' for HashOperations:Module
融合厨师食谱。
这是 libraries / hash_operations.rb 代码的简短版本:
module HashOperations
# Tried: require 'chef/mixin/shell_out'
# Tried: include Chef::Mixin::ShellOut
def self.create_reg_keys(item_hash)
item_hash.each do |item_name, item_props|
# (...) construct the item_keys array
registry_key "HKEY_LOCAL_MACHINE\\SOFTWARE\\#{item_name}" do
recursive true
values item_keys
action :create
end
end
end
def self.generate_reg_keys_for_item_key(...)
# some hash operations here
create_reg_keys(item_hash)
end
end unless defined?(HashOperations)
class Chef::Resource
# Tried: Chef::Resource.send(:include, HashOperations)
# Tried: include HashOperations
extend HashOperations
end
这里是 recipes / default.rb :
Chef::Resource.send(:include, HashOperations)
ruby_block "test" do
block do
# Tried: Chef::Recipe.send(:include, HashOperations)
items_keys.each do |item_key|
HashOperations.generate_reg_keys_for_item_key(..., item_key)
end
end
end
我想主要问题来自于尝试在模块内部的方法中使用Chef资源 registry_key ,而该模块又从配方中调用。
如果我没有使用模块,我有一个工作版本,但如果我想用 ChefSpec 测试代码,我需要一个模块,因为有几篇文章指出(像这一个:Stubbing library class methods in ChefSpec)
上面提到的链接是我使用结束的原因,除非在模块中定义了?(HashOperations)。
我尝试过使用include语句,可以在评论中看到,也可以在食谱的第一行中看到,就像几个StackOverflow帖子所说的那样,没有运气。一篇文章讨论了LWRP的用法,但我真的认为不是这里的情况,因为代码与这个食谱严格相关,不会用在其他食谱中。
作为备注:我正在使用 self。,以便 def 彼此可见,否则我收到有关 generate_reg_keys_for_item_key的错误无法使用。
因此,考虑到我花了相当长的时间寻找解决方案的事实,包括StackOverflow建议的解决方案,问题是:什么是解决此错误的最佳方法,并且有一个简单的解决方案可以用 ChefSpec 进行测试(虽然我不完全排除LWRP),但是我应该包含什么以及如何在 registry_key 中进行融合操作?
答案 0 :(得分:0)
除非帮助程序本身设置为DSL扩展,否则您无法使用此类帮助程序中的配方DSL。查看https://coderanger.net/chef-tips/#3以了解如何操作。