Обновление от 4 января 2014 г.. В ChefSpec теперь реализована следующая идея (>= 3.1.2). См. часть Faster Specs в Readme.
================================
Это выдержка из сообщения в блоге, который раскрывает эту тему с некоторыми дополнительными подробностями.
RSpec позволяет расширять модули с помощью ваших собственных методов, и идея состоит в том, чтобы написать метод, аналогичный let, но который также будет кэшировать результаты в примерах. Создайте файл *spec_helper.rb* где-нибудь в вашем проекте Chef и добавьте туда следующие строки:
module SpecHelper
@@cache = {}
def shared( name, &block )
location = ancestors.first.metadata[:example_group][:location]
define_method( name ) do
@@cache[location + name.to_s] ||= instance_eval( &block )
end
end
def shared!( name, &block )
shared name, &block
before { __send__ name }
end
end
RSpec.configure do |config|
config.extend SpecHelper
end
Значения из @@cache никогда не удаляются, и вы можете использовать те же имена с этим блоком, поэтому я также использую место использования, которое выглядит так: "./cookbooks/my_cookbook/spec/default_spec .рб:3". Теперь измените let( :chef_run )
на shared( :chef_run )
в своих спецификациях:
describe "example::default" do
shared( :chef_run ) { ChefSpec::ChefRunner.new.converge described_recipe }
[...]
end
И при запуске тестов вам также нужно будет включить spec_helper.rb:
rspec --include ./relative/path/spec_helper.rb cookbooks/*/spec/*_spec.rb
person
Draco Ater
schedule
10.12.2013