Rspec 使用shell_out进行Chef库测试

Rspec 使用shell_out进行Chef库测试,rspec,chef-infra,chefspec,Rspec,Chef Infra,Chefspec,我正在为Chef编写自定义资源。该资源用于设置sysctl值。我基本上使用的是Chef sysctl代码,并对其进行了一些限制。我们不信任公司的所有用户:P 我试图将大部分代码放在库帮助器模块中,以便更轻松地测试代码。我不确定这是否是最佳做法。如果这是不好的做法,请告诉我 无论如何,我遇到的问题是尝试测试我的库代码。每当我试图模拟shell_out命令时,总会出现以下错误 1) Sysctl::Helpers.set_sysctl_param Failure/Error: subjec

我正在为Chef编写自定义资源。该资源用于设置sysctl值。我基本上使用的是Chef sysctl代码,并对其进行了一些限制。我们不信任公司的所有用户:P

我试图将大部分代码放在库帮助器模块中,以便更轻松地测试代码。我不确定这是否是最佳做法。如果这是不好的做法,请告诉我

无论如何,我遇到的问题是尝试测试我的库代码。每当我试图模拟shell_out命令时,总会出现以下错误

1) Sysctl::Helpers.set_sysctl_param
     Failure/Error: subject.set_sysctl_param("key1", "value1")

     NoMethodError:
       undefined method `shell_out!' for Sysctl::Helpers:Module
库代码

module Sysctl
  module Helpers
    include Chef::Mixin::ShellOut
    def self.set_sysctl_param(key, value)
      shell_out!("sysctl -w \"#{key}=#{value}\"")
    end
  end
end
试验

我感谢你能给我的任何帮助或建议

谢谢

包含模块时,将模块方法添加为实例方法。但是您尝试在类方法中访问
shell\u out
。实际上,您需要使用Chef::Mixin::ShellOut扩展模块。这样,ShellOut方法将作为类方法添加

module Sysctl
  module Helpers
    extend Chef::Mixin::ShellOut  # replace include with extend
    def self.set_sysctl_param(key, value)
      shell_out!("sysctl -w \"#{key}=#{value}\"")
    end
  end
end

更多信息

谢谢!这非常有用。
module Sysctl
  module Helpers
    extend Chef::Mixin::ShellOut  # replace include with extend
    def self.set_sysctl_param(key, value)
      shell_out!("sysctl -w \"#{key}=#{value}\"")
    end
  end
end