Chef InSpec 中的文件名

File names in Chef InSpec

在Ruby中,*用来表示文件名。

例如,/home/user/*.rb 将 return 所有以 .rb 结尾的文件。我想在 Chef InSpec 中做类似的事情。

例如:

describe file ('home/user/*') do
  it {should_not exist }
end

它应该给我 /home/user 目录中的所有文件,并检查该目录中是否不存在任何文件。换句话说,我想检查这个目录在 Chef 中是否为空。

我该怎么做?

* for globs 主要是 shell 特性,正如您所料,file 资源不支持它们。请改用 command 资源:

describe command('ls /home/user') do
  its(:stdout) { is_expected.to eq "\n" }
end

这是测试目录是否存在的替代方法,如果存在,它使用 Ruby 测试目录中的文件。它还使用 expect 语法,允许自定义错误消息。

control 'Test for an empty dir' do
  describe directory('/hey') do
    it 'This directory should exist and be a directory.' do
      expect(subject).to(exist)
      expect(subject).to(be_directory)
    end
  end
  if (File.exist?('/hey'))
    Array(Dir["/hey/*"]).each do |bad_file|
      describe bad_file do
        it 'This file should not be here.' do
          expect(bad_file).to(be_nil)
        end
      end
    end
  end
end

如果存在文件,则生成的错误消息是提供信息的:

  ×  Test for an empty dir: Directory /hey (2 failed)
     ✔  Directory /hey This directory should exist and be a directory.
     ×  /hey/test2.png This file should not be here.
     expected: nil
          got: "/hey/test2.png"
     ×  /hey/test.png This file should not be here.
     expected: nil
          got: "/hey/test.png"