Невозможно запустить модульный тест rspec "touch_file" в поваренной книге шеф-повара - PullRequest
0 голосов
/ 17 сентября 2018

Кулинарная книга: https://github.com/tkidd77/devops-project/tree/master/chef-repo/cookbooks/hello_world

Мой юнит-тест:

it 'touches the correct file' do
  expect { chef_run }.to touch_file ('C:\inetpub\wwwroot\iisstart.htm')
end

Вывод при запуске «chef exec rspec» в git bash:

tkidd@tkiddhome MINGW64 /c/git/project/chef-repo/cookbooks/hello_world (master) $ chef exec rspec .F

Failures:

  1) hello_world::default touches the correct file
     Failure/Error: expect { chef_run }.to touch_file ('C:\inetpub\wwwroot\iisstart.htm')
       You must pass an argument rather than a block to use the provided matcher ( file "C:\inetpub\wwwroot\iisstart.htm"), or the matcher must implement `supports_block_expectations?`.
     # ./spec/unit/recipes/default_spec.rb:38:in `block (2 levels) in <top (required)>'

Finished in 0.07199 seconds (files took 8.68 seconds to load) 2 examples, 1 failure

Failed examples:

rspec ./spec/unit/recipes/default_spec.rb:37 # hello_world::default touches the correct file

Вот документация chefspec по использованию теста touch_file: https://www.rubydoc.info/github/acrmp/chefspec/ChefSpec/API/FileMatchers, который указывает использование скобок вместо скобок вокруг «chef-run», но когда я это делаю, я получаю ошибку «неопределенный метод»:

tkidd@tkiddhome MINGW64 /c/git/project/chef-repo/cookbooks/hello_world (master) $ chef exec rspec .F

Failures:

  1) hello_world::default touches the correct file
     Failure/Error: expect (chef_run).to touch_file ('C:\inetpub\wwwroot\iisstart.htm')

     NoMethodError:
       undefined method `to' for #<ChefSpec::SoloRunner:0x0000000007a241d8>
     # ./spec/unit/recipes/default_spec.rb:38:in `block (2 levels) in <top (required)>'

Finished in 0.04001 seconds (files took 4.92 seconds to load) 2 examples, 1 failure

Failed examples:

rspec ./spec/unit/recipes/default_spec.rb:37 # hello_world::default touches the correct file

В соответствии с этим rspec 3.0 ожидает метод вместо блока для пути к файлу, но я не понимаю, как это будет выглядеть. Как проверить, является ли переменная экземпляром подкласса модуля с помощью rspec?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Решение:

describe 'hello_world::default' do

  let :chef_run do
    ChefSpec::SoloRunner.new(platform: 'windows', version: '2016').converge(described_recipe)
  end

     it 'touches the correct file' do
       expect(chef_run).to touch_file('C:\inetpub\wwwroot\iisstart.htm')
     end
end
0 голосов
/ 18 сентября 2018

Это должно быть expect(chef_run).to touch_file('C:\inetpub\wwwroot\iisstart.htm'). Вы используете expect { ... } только с raise_error и тому подобным, в большинстве совпадений expect(...) используется как обычный вызов. Также у вас было дополнительное место после touch_file. method (args) недопустимо в Ruby (или, по крайней мере, оно разрешено и не выполняет то, что вы думаете).

...