如何在厨房serverspec测试中要求食谱库

时间:2014-11-28 00:03:55

标签: ruby chef test-kitchen serverspec

在食谱上我定义了一个类Rds :: Checks,它共享用于为bash / execute资源和Guards构建unix命令的方法。文件库/ 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 

在LWPR提供程序,配方和chefspec测试文件加载时没有问题,但当我在服务器规范kitchen verify内使用它时会引发错误。

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

我真的很想保留在公共图层上构建bash / sh命令的方法,这样我就可以单独测试它并且在单元和集成测试中不必担心它们

1 个答案:

答案 0 :(得分:2)

您必须非常手动加载它,可能会将保存cookbook数据的临时文件夹添加到加载路径,我认为它位于/tmp/kitchen/cookbooks下。添加正确的libraries/文件夹,然后按正常要求。整体而言,融合和验证阶段彼此无关,因为测试厨房可以与Chef之外的其他东西一起使用。

你可能想看看像minitest handler这样在Chef converge上下文中运行测试的东西,或audit mode proposal做类似事情的东西。

使用类似其中之一的东西,你可以在cookbook本身编写你的测试,所以收敛实际上会聚合节点然后运行测试,并且验证将是无操作或将运行额外的,外部的测试