2016-06-08 17 views
8

ho scritto questo banco di prova:Elixir assert_raise non cattura eccezioni

assert_raise ArgumentError, myFn(a,b) 

ma non valuta nel modo che ci si aspetterebbe. myFn genera un ArgumentError (do: raise ArgumentError), ma non viene rilevato da assert_raise.

L'esempio nella documentazione funziona bene:

assert_raise ArithmeticError, fn -> 
    1 + "test" 
end 

Dalla documentazione:

assert_raise(exception, function)
afferma la exception viene sollevata durante l'esecuzione function. Restituisce l'eccezione salvata, altrimenti fallisce

Suppongo che nel mio caso di test, gli argomenti vengano valutati per primi. Ma come dovrei averlo scritto?

risposta

11

Avvolgere la chiamata di funzione in una funzione è la strada da percorrere.

assert_raise ArgumentError, fn -> 
    myFn(a, b) 
end 

mi aspettavo assert_raise a prendere una chiamata di funzione, ma ci vuole una funzione.

+2

Sì, 'assert_rise' non è una macro, ma funziona normalmente: https://github.com/elixir-lang/elixir/blob/f4a378f158b00aae0f2ee1c211eccc4314ecec01/lib/ex_unit/lib/ex_unit/assertions.ex#L498 Questo significa che se passi semplicemente 'myFn (a, b)' sarà valutato e il valore sarà passato a 'assert_rise', che è già troppo tardi :) – tkowal