3

在一本食谱上,我定义了一个类 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 测试中,文件加载没有问题,但是当我通过它在 serverspec 中使用它时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 命令的方法,以便我可以单独对其进行测试,而不必在单元和集成测试中为它们烦恼

4

1 回答 1

2

您必须手动加载它,可能将保存食谱数据的临时文件夹添加到加载路径中,我认为它位于/tmp/kitchen/cookbooks. 添加正确的libraries/文件夹,然后正常要求。总体而言,收敛和验证阶段彼此无关,因为 test-kitchen 可以与 Chef 以外的东西一起使用。

您可能想查看类似在 Chef 聚合上下文中运行测试的minitest 处理程序,或执行类似操作的审计模式提案。

使用其中之一,您可以在说明书本身中编写测试,因此收敛实际上将收敛节点然后运行测试,并且验证将是无操作或将运行额外的外部测试。

于 2014-11-28T00:08:27.377 回答