2016-10-18 1 views
1

Предполагая, у меня есть следующий рецепт:Mock Chef :: ReservedNames :: Win32 :: Version.new в разделе «Шеф-повар/rspec»? [Продолжение]

install_iis:

require 'chef/win32/version' 
windows_version = Chef::ReservedNames::Win32::Version.new 

node.set['iis']['components'] = [ 
    'IIS-HttpErrors', 
    'IIS-HttpRedirect', 
    'IIS-HttpLogging', 
    'IIS-LoggingLibraries', 
    'IIS-RequestMonitor', 
    'WAS-WindowsActivationService', 
    'WAS-ProcessModel', 
    'IIS-StaticContent', 
    'IIS-DefaultDocument', 
    'IIS-DirectoryBrowsing' 
] 

include_recipe 'iis::default' 
include_recipe 'iis::mod_aspnet' 
include_recipe 'iis::mod_auth_basic' 
include_recipe 'iis::mod_auth_windows' 
include_recipe 'iis::mod_compress_static' 
include_recipe 'iis::mod_security' 
include_recipe 'iis::mod_management' 

if windows_version.windows_server_2012_r2? 
    include_recipe 'iis::mod_aspnet45' 
    include_recipe 'iis::mod_tracing' 
    include_recipe 'iis::mod_application_initialization' 
end 

Я хочу, чтобы иметь возможность проверить, используя chefspec, если include_recipe методы работают (все в if блок).


После прочтения:

Standard RSpec applies so allow(Chef::ReservedNames::Win32::Version).to receive(:new).and_return(double('fake version')) or similar.

Source:Mock Chef::ReservedNames::Win32::Version.new in Chef unit/rspec test?

Я попытался модифицировать мой install_iis_spec издеваться над Chef::ReservedNames::Win32::Version. Мой файл спецификации теперь выглядит следующим образом:

install_iis_spec:

recipes_2012 = [ 
    'iis::mod_aspnet45', 
    'iis::mod_tracing', 
    'iis::mod_application_initialization' 
] 

context 'when on "Windows Server 2012 R2"' do 
    before do 
    allow(Chef::ReservedNames::Win32::Version).to receive(:new).and_return(double('6.3')) 
    end 

    let(:chef_run) do 
    runner = ChefSpec::SoloRunner.new(platform: 'windows', version: '2012R2') 
    runner.converge(described_recipe) 
    end 

    should_include_recipe(recipes_2012) 

    it 'converges successfully' do 
    expect { chef_run }.to_not raise_error 
    end 
end 

Примечание : Предположим, что метод should_include_recipe работает как задумано.

Примечание : После просмотра double('fake version'), я полагаю, я должен положить значение '6.3'.

Хотя, когда я бегу chef exec rspec spec/unit/recipes/install_iis_spec.rb я получаю следующее сообщение об ошибке:

Console Ошибка:

my_recipe::install_iis when on "Windows Server 2012 R2" runs the 'iis::mod_aspnet45' recipe 
    Failure/Error: runner.converge(described_recipe) 
    #<Double "6.3"> received unexpected message :windows_server_2008? with (no args) 
# C:/Users/me/AppData/Local/Temp/d20161018-26632-iyzn4f/cookbooks/iis/libraries/helper.rb:44:in `older_than_windows2008r2?' 
# C:\Users\me\AppData\Local\Temp\d20161018-26632-iyzn4f\cookbooks\iis\recipes\default.rb:22:in `from_file' 
# C:\Users\me\AppData\Local\Temp\d20161018-26632-iyzn4f\cookbooks\my_recipe\recipes\install_iis.rb:23:in `from_file' 
# ./spec/unit/recipes/install_iis_spec.rb:61:in `block (3 levels) in <top (required)>' 
# ./spec/spec_helper.rb:7:in `block (2 levels) in should_include_recipe' 

Ref:cookbooks/iis/libraries/helper.rb:44:in 'older_than_windows2008r2?'.


Какое значение я должен положить в double('fake version'), чтобы предназначаться Windows Server 2012R2?

Есть ли список поддерживаемых версий?

ответ

0

'6.3' - это всего лишь метка для фальшивого объекта версии. Вам нужно сказать, как реагировать на методы. В этом довольно легко: double('fake version', :windows_server_2008? => false) (или true, если вы хотите притворяться правдой). Обычно вы могли бы сделать это в before блоке, как это:

before do 
    allow(Chef::ReservedNames::Win32::Version).to receive(:new).and_return(double('fake version', :windows_server_2008? => false)) 
end 

Вы можете найти более подробную информацию о том, как использовать RSpec в документации RSpec или в любом из нескольких тысяч учебников я уверен, что доступны через Google.

+1

Спасибо, что расчистил его для меня. Добавление ': windows_server_2008? => false' сделал трюк для этой части. Как только я это сделал, я получил ошибку для ['windows_vista?'] (Https://github.com/chef-cookbooks/iis/blob/b4b503d0721c3f367410901acd5f28453dadeee9/libraries/helper.rb#L45 «github iis cookbook»), которая следующий в списке.Я считаю, что я должен добавить все это в 'and_return', хотя мне просто интересно, есть ли лучший способ сделать это? Благодарю. – Pwnzo

+0

Вот как насмешливые работы, вам нужно конкретно кодировать каждый метод. – coderanger

Смежные вопросы