2013-04-28 12 views
8

Sto cercando di capire come eseguire il test correttamente eccezioni con FsUnit. membri Gazzetta di documentazione, che per testare le eccezioni devo proprio qualcosa di simile:Come testare correttamente eccezioni con FsUnit

(fun() -> failwith "BOOM!" |> ignore) |> should throw typeof<System.Exception> 

Ma, se non segnalare il mio metodo di prova con [<ExpectedException>] attributo sarà sempre esito negativo. Sembra ragionevole perché se vogliamo testare le eccezioni dobbiamo aggiungere tale attributo in C# + NUnit.

Ma, fino a quando ho aggiunto questo attributo non importa che tipo di eccezione che sto cercando di buttare, sarà sempre gestito.

Alcuni frammenti: miei LogicModule.fs

exception EmptyStringException of string 

let getNumber str = 
    if str = "" then raise (EmptyStringException("Can not extract number from empty string")) 
    else int str 

miei LogicModuleTest.fs

[<Test>] 
[<ExpectedException>] 
let``check exception``()= 
    (getNumber "") |> should throw typeof<LogicModule.EmptyStringException> 
+2

FYI - con Unquote, https://code.google.com/p/unquote/, si asserire che 'getNumber" "' nel tuo ultimo esempio solleva l'eccezione prevista come 'solleva <@ getNumber" "@ > ' –

risposta

15

risposta. Per verificare tale eccezione è stata gettata dovrei avvolgere la mia chiamata di funzione in stile successivo:

(fun() -> getNumber "" |> ignore) |> should throw typeof<LogicModule.EmptyStringException> 

perché #fsunit sotto utilizza NUnit di Getta vincolo http://www.nunit.org/index.php?p=throwsConstraint&r=2.5 ... che prende un delegato di vuoto, aumentare i rendimenti 'un

+0

Buona risposta - Non penso che tu voglia l'attributo ExpectedException, comunque. – TrueWill

+0

Si noti che è necessario restituire un'unità dalla lambda (vale a dire terminare la definizione divertente con "|> ignora"). –

3

Se si desidera verificare che un tipo di eccezione specifico viene sollevata da un codice, è possibile aggiungere il tipo eccezione alla [<ExpectedException>] attributo modo:

[<Test; ExpectedException(typeof<LogicModule.EmptyStringException>)>] 
let``check exception``() : unit = 
    (getNumber "") 
    |> ignore 

Più documentazione è disponibile sul sito NUnit: è stato trovato http://www.nunit.org/index.php?p=exception&r=2.6.2

+0

Grazie per la risposta, ma non mi piace l'idea di aggiungere qualche attributo aggiuntivo, perché non sembra così bello quando si utilizza FsUnit. – PompolutZ

Problemi correlati