2011-01-23 16 views
13

Si tengo una especificación que necesita ejecutarse con diferentes valores para que conduzca una implementación real y no ingenua. Un ejemplo:¿Es posible tener especificaciones parametrizadas en RSpec?

it "should return 'fizz' for multiples of three" do 
    @fizzbuzz.get_value(3).should == "fizz" 
end 

Hasta ahora no he encontrado ninguna forma de pasar 3 en como parámetro. La siguiente especificación resuelve mi problema, pero me pregunto si es la forma recomendada de hacerlo o si hay alguna otra forma mejor.

it "should return 'fizz' for multiples of three" do 
    [3, 6].each{|number| @fizzbuzz.get_value(number).should == "fizz" } 
end 

No me gusta esta, ya que utiliza bucles, no es fácil de leer y que sólo aparece como una especificación cuando se ejecuta, yo preferiría tener que aparecen como dos pruebas diferentes.

Respuesta

20

Para generar pruebas por separado que podría hacer:

[3, 6].each do |num| 
    it "should return 'fizz' for multiples of three (#{num})" do 
    @fizzbuzz.get_value(num).should == "fizz" 
    end 
end 

Dado que los archivos de especificaciones son simples carrera como scripts de rubí que puede utilizar todo el estándar de Ruby construye para generar pruebas sobre la marcha.

Aún mejor, puede usar Numeric#step para generar fácilmente un cierto rango de pruebas, p. para [3, 6, 9, 12, 15, 18]:

3.step(18, 3) do |num| 
    it "should return 'fizz' for multiples of three (#{num})" do 
    @fizzbuzz.get_value(num).should == "fizz" 
    end 
end 
Cuestiones relacionadas