1

我正在尝试编写 serverspec 测试,通过使用 chef、kitchen 和 vagrant 以及 debian jessie 框来检查食谱是否正在设置 mariadb-server。

食谱很简单:

# cookbooks/mariadb/recipes/server.rb
package 'mariadb-server' do
  action :install
end

我写的规范是:

# cookbooks/mariadb/test/integration/default/serverspec/server_spec.rb
require 'spec_helper'

describe 'mariadb::server' do
  context package('mariadb-server') do
    it 'is installed' do
      expect be_installed
    end
  end
end

但是,在运行时kitchen verify,无论包状态如何,它总是返回 true。如果我 ssh 进入 vagrant box 并删除包,然后运行kitchen verify,我也会得到一个积极的结果。

即使我将包更改为一些随机字符串,例如context package('this-is-not-a-package') do测试结果为真。

我在这里做错了什么?

4

1 回答 1

2

在更一般的意义上,这不遵循 RSpec 3 匹配器语法。

您可以考虑这样做:

describe 'mariadb::server' do
  describe package('mariadb-server') do
    it { expect(subject).to be_installed }
  end
end

这看起来更干净,并且输出更干净,因为 serverspec 使用文档格式化程序进行 RSpec 输出。

为了进一步让您了解幕后发生的事情,以便您了解这里发生的事情,而不是假设这一切都是魔术,这里是如何进行这些检查的一般模板:

describe method(argument) do
  it { expect(subject).to be_boolean-matcher.with_chain(argument_two) }
end

并针对您的情况(您没有使用version链条,但我添加了它以获取更多信息)

  • 方法:打包
  • 参数:mariadb-server
  • 主题:将解析为包(mariadb-server)
  • 布尔匹配器:已安装
  • 链:版本
  • 论据_二:1.2.3
于 2016-05-25T17:15:15.097 回答