2010-03-01 19 views
26

Estoy intentando esperar un error en una prueba rspec.Esperando errores en las pruebas rspec

lambda {Participant.create!({:user_id => three.id, :match_id => match.id, :team => 1})}.should raise_error StandardError 

Por ahora sólo estoy usando StandardError para asegurarse de que está funcionando.

1) StandardError in 'Participant should never allow more participants than players'. 
    This game is already full. Cannot add another player. 
/home/josiah/Projects/Set-Match/app/models/participant.rb:12:in `do_not_exceed_player_count_in_match' 
./spec/models/participant_spec.rb:24: 

Claramente arroja el error, pero mi prueba aún falla.

¿Pensamientos?

Respuesta

34

La sintaxis es correcta. Para depurar esto, simplifique para asegurarse de que su especificación esté codificada correctamente.

it "should raise an error" do 
    lambda {raise "boom"}.should raise_error 
end 

Y luego agregue más detalles hasta que se rompa.

lambda {raise "boom"}.should raise_error(RuntimeError) 
lambda {raise StandardError.new("boom")}.should raise_error(StandardError) 
+0

Gracias por la punta. –

5

he tenido que luchar con los mismos síntomas:

def boom 
    raise "boom" 
end 
boom.should raise_error 

La prueba anterior falla porque raise_error requiere should a ser llamados en un Proc (debido a razones técnicas, supongo). Por lo tanto, envolviendo una llamada al método con una lambda funciona bien:

lambda { boom }.should raise_error 

Por desgracia, la documentación no dice que de forma explícita y no hay excepción RSpec que revela este comportamiento. Hay un two year old ticket para eso.

+2

"boom.should raise_error" falla porque la pluma se evalúa justo antes de hacer el "debería"; lambda, en cambio, es llamado por el "deber" en sí mismo. – grilix

45

Desde algún tiempo, pero al menos en RSpec 2,5, es posible utilizar

expect {raise 'boom'}.to raise_error(RuntimeError, /boom/) 
Cuestiones relacionadas