Serverspec是否支持预期或我必须使用?

时间:2019-05-22 10:40:02

标签: expectations serverspec

我听说我应该使用期望而不是Serverspec中的“应该”声明

我一直在寻找可以用于文件匹配的期望,但是我看到的所有用于Serverspec的教程都应该而不是期望。这是因为Serverspec尚未更新为使用期望值吗?

describe file('/etc/yum.conf') do
  it { should be_file }
  it { should be_owned_by 'root' }
  it { should be_grouped_into 'root' }
  it { should be_mode 644 }

  its(:content) { should match /^gpgcheck=1$/ }
  its(:content) { should match /^clean_requirements_on_remove=1$/ }
end

那么我该如何使用期望而不是应该的方式编写测试?

1 个答案:

答案 0 :(得分:1)

您的第一个问题:

  

...我看到的所有用于Serverspec的教程都应该而不是期望。这是因为Serverspec尚未更新为使用期望值吗?

不,主要是因为Serverspec项目的作者偏爱“ should”语法,这就是Serverspec文档继续使用它的原因。他向here解释说:

  

我使用should语法而不是expect语法,因为我认为should语法比expect语法更具可读性,而且我喜欢它。

     

推荐使用expect语法,因为在与BasicObject子类化的代理对象一起使用时,向每个对象添加should会导致失败。

     

但是此页面中的示例所使用的单行语法不会添加到任何对象,因此该语法不会导致上述问题。这就是为什么我使用单线应语法。

请注意,shouldexpect来自rspec-expectations项目,Serverspec作者是正确的“应该”而不是“期望”,这是他使用方式的正确选择。

Rspec的作者Myron Marston here提供了有关期望语法的原始动机的更多信息。

您的第二个问题:

  

...我该如何使用期望而不是应该的方式编写测试?

如果您仍然想使用expect语法,只需在各处将should替换为is_expected.to。效果很好:

describe file("/etc/passwd") do
  it { is_expected.to be_file }
  its(:content) { is_expected.to match /root/ }
end

您也可以这样写:

describe "passwd file" do
  it "the passwd file should be a file" do
    expect(file("/etc/passwd")).to be_file }
  end
  it "and it should contain root" do
    expect(file("/etc/passwd").content).to match /root/
  end
end

甚至:

describe file("/etc/passwd") do
  it { expect(subject).to be_file }
  it { expect(subject.content).to match /root/ }
end

另请参阅: