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.