Chef - ChefSpec

Test Driven Development (TDD)es una forma de escribir una prueba unitaria antes de escribir cualquier código de receta real. La prueba debe ser real y debe validar lo que hace una receta. En realidad, debería fallar ya que no se desarrolló una receta. Una vez que se desarrolla la receta, la prueba debe pasar.

ChefSpec se basa en el popular marco RSpec y ofrece una sintaxis personalizada para probar la receta de Chef.

Creando ChefSpec

Step 1 - Cree un archivo de gemas que contenga la gema chefSpec.

[email protected]:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'chefspec'

Step 2 - Instala la gema.

[email protected]:~/chef-repo $ bundler install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing chefspec (1.3.1) 
Using bundler (1.3.5) 
Your bundle is complete!

Step 3 - Cree un directorio de especificaciones.

[email protected]:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec

Step 4 - Crear una especificación

[email protected]:~/chef-repo $ subl  
cookbooks/my_cookbook/spec/default_spec.rb  
require 'chefspec'  
describe 'my_cookbook::default' do  
   let(:chef_run) {  
      ChefSpec::ChefRunner.new(  
         platform:'ubuntu', version:'12.04'  
      ).converge(described_recipe)  
   }  

   it 'creates a greetings file, containing the platform  
   name' do  
      expect(chef_run).to  
      create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!')  
   end  
end

Step 5 - Validar ChefSpec.

[email protected]:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
F 
Failures: 
1) <CookBook Name> ::default creates a greetings file, containing the platform name 
Failure/Error: expect(chef_run.converge(described_recipe)).to 
create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!') 
File content: 
does not match expected: 
Hello! ubuntu! 
# ./cookbooks/my_cookbook/spec/default_spec.rb:11:in `block 
(2 levels) in <top (required)>' 
Finished in 0.11152 seconds 
1 example, 1 failure  

Failed examples: 
rspec ./cookbooks/my_cookbook/spec/default_spec.rb:10 # my_ 
cookbook::default creates a greetings file, containing the 
platform name

Step 6 - Editar receta predeterminada de libros de cocina.

[email protected]:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
template '/tmp/greeting.txt' do 
   variables greeting: 'Hello!' 
end

Step 7 - Crea un archivo de plantilla.

[email protected]:~/chef-repo $ subl cookbooks/< Cookbook Name>/recipes/default.rb 
<%= @greeting %> <%= node['platform'] %>!

Step 8 - Ejecute el rspec de nuevo.

[email protected]:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
. 
Finished in 0.10142 seconds 
1 example, 0 failures

Cómo funciona

Para que funcione, primero debemos configurar la infraestructura base para usar RSpec con Chef. Luego, necesitamos la gema ChefSpec Ruby y el libro de cocina necesita un directorio llamado spec donde se guardarán todas las pruebas.