Ruby 如何在kitchen serverspec测试中要求cookbook库

Ruby 如何在kitchen serverspec测试中要求cookbook库,ruby,chef-infra,test-kitchen,serverspec,Ruby,Chef Infra,Test Kitchen,Serverspec,在一本食谱上,我定义了一个类Rds::Checks,该类共享为bash/execute资源和保护构建unix命令的方法。文件libraries/checks.rb的示例如下: module Rds class Checks class << self def ssh_config_entry_present host, config_file, key_name "cat #{config_file} | grep #{key_name}"

在一本食谱上,我定义了一个类Rds::Checks,该类共享为bash/execute资源和保护构建unix命令的方法。文件libraries/checks.rb的示例如下:

module Rds
 class Checks
   class << self

     def ssh_config_entry_present host, config_file, key_name
       "cat #{config_file} | grep #{key_name}"   
     end

     def redmine_migrated user, pass, name
       "if [ `mysql -u#{user} -p#{pass} -e 'select count(id) FROM #{name}.users;' | sed -n '2 p'` -gt 0 ]; then echo '0'; else echo '1'; fi"
     end

   end
 end
end 

我真的希望保留在公共层上构建bash/sh命令的方法,这样我就可以单独测试它,而不用在单元测试和集成测试中担心它们

您必须非常手动地加载它,可能需要将保存烹饪书数据的临时文件夹添加到加载路径,我想它在
/tmp/厨房/烹饪书
下。添加正确的
libraries/
文件夹,然后按照正常要求添加。总的来说,converge和verify阶段互不相关,因为测试厨房可以用于Chef之外的其他东西

您可能想看看在Chef converge上下文中运行测试的,或者做类似事情的


使用其中一种方法,您可以在cookbook本身中编写测试,因此converge实际上是将节点聚合,然后运行测试,并验证是否为no op或运行其他外部测试。

可能是将此库作为gem共享并将其添加到gem文件的解决方案?当然,不过,这需要做更多的工作。您可以强制busser serverspec安装这样的自定义gem,但这并不是非常简单。busser-rspec和busser serverspec接受一个gem文件,因此强制它们安装自定义gem不会太糟糕。
paolo@tower:~/cookbooks/rds$ cat test/integration/install/serverspec/localhost/install_spec.rb
...
    it 'do migrations' do
      cmd = Rds::Checks.redmine_migrated 
      expect(command(cmd).stdout).to eq 0
    end
...


paolo@tower:~/cookbooks/rds$ kitchen verify

...

    NameError:
      uninitialized constant Rds