Menú principal

Sintaxis de una línea en RSpec

29 Jul
Published by ApuX in

Tags 

Ruby

Una de las características que más me gustan de RSpec es la posibilidad de emplear sintaxis de una sola línea. Imaginemos un spec de la siguiente manera:

describe Car do
 
  it 'should have 4 wheels' do
    car = Car.new
    car.wheels.count.should == 4
  end
 
  it 'should be awesome' do
    car = Car.new
    car.should be_awesome
  end
 
  describe '#color' do
    context 'when created by default' do
      it 'should be blue' do
       car = Car.new
        car.color.should == 'blue'
      end
    end
 
    context 'when created with black color' do
      it 'should be black' do
        car = Car.new 'black'
        car.color.should == 'black'
      end
    end
  end
 
end

Imaginemos también que tenemos una clase que pasa todas esas pruebas. Para fines descriptivos, ejecutamos la prueba con la opción --format doc. El resultado es el siguiente:

Car
  should have 4 wheels
  should be awesome
  #color
    when created by default
      should be blue
    when created with black color
      should be black

El spec también se puede escribir usando la sintaxis de una sola línea de RSpec:

describe Car do
  it { should have(4).wheels }
  it { should be_awesome }
  its(:color) { should == 'blue' }
 
  context 'when black color is specified' do
    subject { Car.new 'black' }
    its(:color) { should == 'black' }
  end
end

Las líneas 2, 3 y 4 son ejemplos que prueban un subject implícito. Ruby lo crea de manera automática utilizando el constructor por defecto de la clase. La línea 8, en cambio, prueba un subject explícito creado en la línea 7, donde podemos personalizar la forma en la que se crea.

Las líneas 2 y 3 prueban directamente sobre el objecto creado, mientras que la línea 4 y 8 prueban sobre el resultado de un método de ese objeto.

Es un refactor menor, pero permite que la prueba sea más fácil de leer, no sólo porque es más conciso sino porque elimina descripción que resulta innecesaria. Además, el resultado de las pruebas también resulta bastante completo:

Car
  should have 4 wheels
  should be awesome
  color
    should == "blue"
  when black color is specified
    color
      should == "black"

NOTA: Desafortunadamente, para la versión 3 de RSpec, el método its (utilizado en las líneas 4 y 8) será removido del core, por lo que no podríamos usarlo. Por suerte, se creará una gema que agregue esa funcionalidad, sólo que tendrá que instalarse por separado.