Matchers de RSpec para métodos booleanos

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 los precios de 999 y 1000 hagan que nuestro producto no sea expensive y el precio de 1001 haga 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
  it 'is not expensive when price is less than 1000' do
    Product.new(999).should_not be_expensive
  end

  it 'is not expensive when price is equal to 1000' do
    Product.new(1000).should_not be_expensive
  end

  it 'is expensive when price is greater than 1000' do
    Product.new(1001).should be_expensive
  end
end

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

comments powered by Disqus