2013-04-28 14 views
8

Próbuję dowiedzieć się, jak poprawnie testować wyjątki z FsUnit. Urzędowa dokumentacja, że ​​do testowania wyjątkami muszę prawej coś takiego:Jak poprawnie przetestować wyjątki z FsUnit

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

Ale jeśli nie oznaczyć metodę testową z [<ExpectedException>] atrybut będzie zawsze niepowodzeniem. Brzmi rozsądnie, ponieważ jeśli chcemy przetestować wyjątki, musimy dodać taki atrybut w C# + NUnit.

Ale tak długo, jak dodałem ten atrybut, nie ma znaczenia, jaki rodzaj wyjątku, który próbuję wyrzucić, będzie on zawsze obsługiwany.

Niektóre fragmenty: Moi LogicModule.fs

exception EmptyStringException of string 

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

Moi LogicModuleTest.fs

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

FYI - z Unquote, https://code.google.com/p/unquote/, zapewniłbyś, że 'getNumber" "' w twoim ostatnim przykładzie podnosi oczekiwany wyjątek, taki jak 'podnosi <@ getNumber" "@ > ' –

Odpowiedz

15

Odpowiedź została znaleziona. Aby sprawdzić, czy wyjątek powinien zawinąć moja wywołanie funkcji w następnym stylu:

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

ponieważ pod #fsunit używa NUnit rzuca ograniczenie http://www.nunit.org/index.php?p=throwsConstraint&r=2.5 ... która przyjmuje delegata nieważne, podnieść zyski „a

+0

Dobra odpowiedź - nie sądzę, że chcesz mieć atrybut ExpectedException. – TrueWill

+0

Należy zwrócić uwagę, że wymagana jest jednostka zwrotna z lambda (tj. Kończąca zabawną definicję z "|> ignore"). –

3

Jeśli chcesz sprawdzić, czy konkretny typ jest wyjątek od jakiegoś kodu, można dodać typ wyjątku do atrybutu [<ExpectedException>]:

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

Więcej dokumentacji jest dostępnych na stronie NUnit: http://www.nunit.org/index.php?p=exception&r=2.6.2

+0

Dziękuję za odpowiedź, ale nie podoba mi się pomysł dodania jakiegoś dodatkowego atrybutu, ponieważ nie wygląda tak wspaniale, gdy używasz FsUnit. – PompolutZ

Powiązane problemy