0

我正在尝试为我的食谱编写chefspec/单元测试。我面临问题。我需要为下面的代码编写单元测试用例。如果我注释了代码的最后一条语句,则测试会成功执行,但我也必须抓住该语句,因为它是正确的编写方式。感谢您的帮助。

powershell_script 'Delete ISO from temp directory' do
    code <<-EOH
            [System.IO.File]::Delete("#{iso_path}")
            [System.IO.File]::Delete("#{config_path}")
            EOH
    guard_interpreter :powershell_script
    only_if { File.exists?(iso_path)}
end
4

2 回答 2

0

因此,首先,您的代码没有意义。您有一个guard_interpreter集合,但您的保护子句是 Ruby 代码块,而不是命令字符串。除此之外,只需像其他任何东西一样测试它。如果您的意思是如何测试文件存在和不存在,您将使用rspec-mocks设置File.exists?返回一个固定值。

于 2017-02-14T18:30:30.750 回答
0

首先。如果您只需要删除一个文件,并且根据这种情况的代码,您应该使用fileresource.

[iso_path, config_path].each do |path|
  file path do
    action :delete
  end
end

File是幂等资源。这意味着 Chef 会检查您是否应该更改资源。在这种情况下,Chef 将删除该文件,前提是该文件存在。

Powershell_script(以及所有其他script资源)是非幂等的。这意味着,您已经通过提供guard. 守卫only_ifnot_if阻挡。您应该删除guard_interpreter :powershell_script行,因为您实际上是在警卫中编写 ruby​​。

powershell_script 'Delete ISO from temp directory' do
  code <<-EOH
    [System.IO.File]::Delete("#{iso_path}")
    [System.IO.File]::Delete("#{config_path}")
    EOH
  only_if { File.exists?(iso_path) }
end

现在进行测试。测试file资源很容易,因为我知道您已经可以做到这一点。但测试powershell_script更难:您必须对File.exists?(iso_path)调用进行存根。你可以这样做:

describe 'cookbook::recipe' do
  context 'with iso file' do
    let! :subject do
      expect( ::File ).to receive( :exists? ).with( '<iso_path_variable_value>' ).and_return true
      allow( ::File ).to receive( :exists? ).and_call_original
      ChefSpec::Runner.new( platform: 'windows', version: '2008R2' ).converge described_recipe
    end

    it { shold run_powershell_script 'Delete ISO from temp directory' }
  end

  context 'without iso file' do
    let! :subject do
      expect( ::File ).to receive( :exists? ).with( '<iso_path_variable_value>' ).and_return false
      allow( ::File ).to receive( :exists? ).and_call_original
      ChefSpec::Runner.new( platform: 'windows', version: '2008R2' ).converge described_recipe
    end

    it { shold_not run_powershell_script 'Delete ISO from temp directory' }
  end
end

file与测试资源相比,您是否看到还有多少工作要做?

于 2017-02-16T07:23:06.107 回答