【问题标题】:Testing Chef cookbook failure测试 Chef 食谱失败
【发布时间】:2017-06-23 15:45:56
【问题描述】:

我正在编写一本包含自定义资源的食谱,该资源(除其他外)通过ssh-keygen 验证 SSH 密钥。我需要测试用户输入无效输入和资源应该引发异常的场景,所以我正在寻找一种方法来验证“给定以下输入......厨师运行失败”。

如果我正确理解所有内容,Test Kitchen 意味着每次收敛都会成功,而 ChefSpec 意味着资源永远不会真正执行(因此我的 ssh-keygen 调用将永远不会被调用)。

是否有任何常规方法来测试这种情况?

【问题讨论】:

  • 是的,像任何其他库一样模拟 shellout 调用,如 ChefSpec 自述文件中的 here 所述。并期望它引发异常,这应该匹配整个事情。
  • 应该把这个复制到一个答案:)
  • @Tensibai 实际问题不是嘲笑,我想我在谈论食谱内部时过于精确。我需要测试我的资源是否按预期响应来自 ssh-keygen 的不同响应,但 ChefSpec 没有执行我的资源 - 据我了解,这是 ChefSpec 的唯一模式。所以实际上我可以测试我的资源在某处被调用,可以测试only_if / not_if 守卫,但不能测试资源行为本身。
  • 是自定义资源吗?
  • 那你需要告诉chefspec到step_into这个自定义资源

标签: chef-infra test-kitchen chefspec


【解决方案1】:

要测试 custom_resource 的内部位,您必须告诉 ChefSpec step_into 它。没错,ChefSpec 在正常情况下不会执行提供程序。

要对失败进行正确测试,您应该 expect(:chef_run).to raise_error 描述 here in the documentation

引用step_into的文档:

为了运行 LWRP 公开的操作,您必须 明确告诉Runner 进入它:

需要“厨师规格”

describe 'foo::default' do
  let(:chef_run) do
    ChefSpec::SoloRunner.new(step_into: ['my_lwrp']).converge('foo::default')
  end

  it 'installs the foo package through my_lwrp' do
    expect(chef_run).to install_package('foo')
  end
end

注意:如果您的食谱公开了 LWRP,强烈建议您 还创建一个 library/matchers.rb 文件,如下所述 “打包自定义匹配器”部分。 你永远不应该踏入 LWRP 除非你正在测试它。永远不要从另一个人进入 LWRP 食谱!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多