2015-07-13 2 views
2

Я пишу собственный кукольный модуль, который включает ресурс :: apache :: vhost, и хотел бы проверить в моих тестах rspec, что параметр каталогов содержит определенное значение, без воспроизведения всей конфигурации каталогов, которая в основном жестко закодирована в тесте spec.Как проверить, содержит ли параметр массива ресурс Puppet значение

class foo::apache { 

    # prepend 'from ' to each element in array of subnets 
    # Change this ugliness to use map once we've upgraded to puppet v4 
    # open to suggetions on better way to do this too... 
    $subnets = $::foo::subnets 
    $subnets_yaml = inline_template('<%= subnets.map {|s| "from " +s}.to_yaml %>') 
    $allowed_subnets_directives = parseyaml($subnets_yaml) 

    ::apache::vhost { 'foo_vhost': 
    directories => [ 
     -- snip -- 
     ##### How can I check just the path & allow keys of this element? 
     { 'path' => '~^.*$', 
     'Order' => 'deny,allow', 
     'allow' => concat(['from localhost'], 
        $allowed_subnets_directives), 
     'provider' => 'location', 
     }, 
    ] 
    } # foo_vhost 
} # foo::apache 

Я снял большую часть манифеста для краткости.

я могу проверить параметр целых директив с чем-то вдоль линий

describe 'foo::apache' do 
    it { is_expected.to contain_apache__vhost('foo_vhost').with(
    'directories' => [{'path' => '~^.*$', 
         'allow' => ['from localhost', 
            'from 10.20.30/24', 
            ],}, 
        ] 

но параметр каталоги длинный и статический, и я заинтересован, чтобы избежать этого.

RSpec include согласовань выглядит то, что мне нужно, но я не могу работать, как использовать его, чтобы проверить параметр, или $allowed_subnets_directives переменные

+1

FWIW, предваряя материал ко всему, в массиве может быть сделано в более ранних версиях, используя [функцию regsubst] (http://docs.puppetlabs.com/references/stable/function.html#regsubst). –

ответ

0

Недавно я наткнулся на эту же проблему. Существует нет простого способа прямого доступа к внутренней части параметра.

Я разговаривал с dev_el_ops в voxpupuli канала на Freenode, и он сказал, что «один из проектных задач RSpec-pupet является то, что он не раскрывает значение свойств регулярного Rspec matchers»

Я не уверен на лучший способ «найти хэш с ключом в массиве» в рубине, так что я ссылки this answer способ, которым я хотел бы проверить выше что-то вроде этого

it do 
    vhost_directories = catalogue.resource('apache__vhost', 'foo_vhost').send(:parameters)[:directories] 
    expect(vhost_directories.find {|x| x[:path] == '~^.*$'}).to be_truthy 
end 

Если вы делаете предположение, что оно находится в первой записи в массиве, вы можете использовать несколько более читаемый 'include' matcher на хэш.

it do 
    vhost_directories = catalogue.resource('apache__vhost', 'foo_vhost').send(:parameters)[:directories] 
    expect(vhost_directories.first).to include(:path => '~^.*$') 
end