2012-01-06 6 views
8

Estoy creando algunas pruebas que tienen una variedad de entradas. Estoy probando un sitio web de compras con tipos de usuarios nuevos y recurrentes, diferentes productos, códigos de promoción, opciones de pago. Sentí que se trataba de un conjunto de pruebas basado en datos, que probablemente requería un formato de hoja de cálculo o csv de las entradas de prueba.La mejor manera de organizar pruebas en RSpec que tienen una Combinaciones de factor

He estado usando rspec, que fue perfecto para el último conjunto de pruebas que he creado.

Me gustaría tener formatos de resultados coherentes. Estoy atascado en cómo usar tablas de datos con RSpec. ¿Alguien ha usado RSpec con una tabla de entradas de prueba?

Gracias de antemano por una solución directa o un buen consejo.

Respuesta

14

Si va a utilizar una tabla, que lo definiría en línea en el archivo de prueba algo como ...

[ 
    %w(abc 123 def ), 
    %w(wxyz 9876 ab ), 
    %w(mn 10 pqrs) 
].each do |a,b,c| 
    describe "Given inputs #{a} and #{b}" do 
    it "returns #{c}" do 
     Something.whatever(a,b).should == c 
    end 
    end 
end 
+0

Eso es más o menos lo que yo estoy buscando la excepción de que voy a hacer la tabla de la 'que "debe hacer lo que sea que "haga" parte. ¡Gracias! –

2
user_types = ['rich', 'poor'] 
products = ['apples', 'bananas'] 
promo_codes = [123, 234] 
results = [12,23,34,45,56,67,78,89].to_enum 
test_combis = user_types.product(products, promo_codes) 

test_combis.each do |ut, p, pc| 
    puts "testing #{ut}, #{p} and #{pc} should == #{results.next}" 
end 

Salida:

testing rich, apples and 123 should == 12 
testing rich, apples and 234 should == 23 
testing rich, bananas and 123 should == 34 
testing rich, bananas and 234 should == 45 
testing poor, apples and 123 should == 56 
testing poor, apples and 234 should == 67 
testing poor, bananas and 123 should == 78 
testing poor, bananas and 234 should == 89 
2

Uno El enfoque idiomático sería usar RSpec shared examples con parámetros. Voy a suponer que cada fila de la tabla corresponde a un caso de prueba distinto, y las columnas descomponen las variables involucradas.

Como ejemplo, supongamos que tiene algún código que calcula el precio de un automóvil en función de su configuración. Digamos que tenemos una clase Car y queremos probar que el método price se ajusta al precio minorista sugerido por el fabricante (MSRP).

Podríamos estar obligados a probar las siguientes combinaciones:

 
Doors | Color | Interior | MSRP 
-------------------------------- 
4  | Blue | Cloth | $X 
2  | Red | Leather | $Y 

Vamos a crear un ejemplo común que captura esta información y pruebas para el comportamiento correcto.

RSpec.shared_examples "msrp" do |doors, color, interior, msrp| 
    context "with #{doors} doors, #{color}, #{interior}" do 
    subject { Car.new(doors, color, interior).price } 
    it { should eq(msrp) } 
    end 
end 

haber escrito este ejemplo compartida, podemos probar de manera sucinta múltiples configuraciones sin la carga de la duplicación de código.

RSpec.describe Car do 
    describe "#price" do 
    it_should_behave_like "msrp", 4, "Blue", "Cloth", X 
    it_should_behave_like "msrp", 2, "Red", "Leather", Y 
    end 
end 

Cuando corremos esta especificación, la salida debe ser de la forma:

 
Car 
    #price 
    it should behave like msrp 
     when 4 doors, Blue, Cloth 
     should equal X 
     when 2 doors, Red, Leather 
     should equal Y 
Cuestiones relacionadas