Matchers para métodos booleanos en RSpec

02 Sep
Published by ApuX in

Tags 

Ruby

Ya he tocado este tema en post santeriores, pero no me había detenido lo suficiente para explicarlo. RSpec incluye una funcionalidad muy práctica al momento de probar métodos que regresan falso o verdadero. Por convención, en Ruby estos métodos terminan con un signo de interrogación que cierra: ?.

Ejemplo:

class Product
 
  def initialize(price)
    @price = price
  end
 
  def expensive?
    @price > 1000
  end
end

En la clase vemos que el método expensive? nos regresa verdadero si el precio del producto es mayor a 1000 y falso en caso contrario. La prueba en RSpec sería como la que sigue:

describe Product do
  describe "#expensive?" do
    it 'is false when price is less than 1000' do
      Product.new(999).expensive?.should == false
    end
 
    it 'is false when price is equal to 1000' do
      Product.new(1000).expensive?.should == false
    end
 
    it 'is true when price is greater than 1000' do
      Product.new(1001).expensive?.should == true
    end
  end
end

Lo que se prueba son los casos límite para nuestro escenario: que el precio de 999 haga que nuestro producto no sea expensive y que los precios de 1000 y 1001 hagan que sí lo sea.

La prueba es correcta y considero que los casos probados son los adecuados, sin embargo, la sintaxis puede ser mejorada. RSpec integra algunos matchers que permiten una sintaxis más concisa: todos los métodos que terminan con ? pueden ser verificados con el matcher be_*, donde * es el nombre del método sin el signo de interrogación. En nuestro caso: be_expensive. La prueba completa puede quedar de la siguiente manera:

describe Product do
  describe "#expensive?" do
    it 'is false when price is less than 1000' do
      Product.new(999).should be_expensive
    end
 
    it 'is false when price is equal to 1000' do
      Product.new(1000).should_not be_expensive
    end
 
    it 'is true when price is greater than 1000' do
      Product.new(1001).should be_expensive
    end
  end
end

El cambio es menor, pero permite una mejor lectura y eso siempre se agradece.