2012-12-12 14 views
6

Próbuję napisać kilka testów NUnit w F # i problemy z przekazaniem funkcji do ThrowsConstraint. Próbka destylowana (nie) działająca jest poniżej.Jak przekazać funkcję do NUnit Throws Constraint?

open System.IO 
open NUnit.Framework 

[<TestFixture>] 
module Example = 

    [<Test>] 
    let foo() = 
     let f = fun() -> File.GetAttributes("non-existing.file") 
     Assert.That(f, Throws.TypeOf<FileNotFoundException>()) 

To kompiluje dobrze, ale pojawia się następujący z NUnit testu biegacza:

FsTest.Tests.Example.foo: 
System.ArgumentException : The actual value must be a TestDelegate but was [email protected] 
Parameter name: actual 

ile jestem w stanie obejść ten problem przy użyciu atrybutu ExpectedException, moje pytanie brzmi, jaka jest poprawna sposób korzystania z funkcji F # w tej sytuacji?

Odpowiedz

7

Wszystko, co musisz zrobić, aby oryginalny fragment kodu zadziałał, to poprawianie f, aby podpis był zgodny z TestDelegate, czyli unit -> unit. Po prostu odrzucić wartości zwracanej File.GetAttributes:

let f = fun() -> File.GetAttributes("non-existing.file") |> ignore 

F # kompilator nie barf w oryginalnym kodzie bo po prostu inny stosowny NUnit przeciążać Assert.That(actual: obj, expression: Constraints.IResolveConstraint) istnieje.

Jak Assert.That ma bardzo szerokie zastosowanie będę trzymać do testowania oczekiwane wyjątki bardziej specyficzna forma assert, np

[<Test>] 
let foo() = 
    Assert.Throws<FileNotFoundException> 
     (fun() -> File.GetAttributes("non-existing.file")|> ignore) 
    |> ignore 

gdzie F # kompilator będzie w stanie dostrzec statycznie zły podpis swojej funkcji.

+0

Wielkie dzięki za wyjaśnienie. –

+0

Fajnie, to dobre rozwiązanie, ponieważ w F # (VS 2010) podejście do atrybutów nie działało dla mnie (próbowałem zaznaczyć metodę testową z atrybutem ExpectedException i to w ogóle nie działało) Dzięki! – Roboblob

4

IMHO, można zaoszczędzić sobie trochę bólu za pomocą Unquote na górze NUnit. Wtedy twoje twierdzenie byłoby tak proste, jak

[<Test>] 
let foo() = 
    raises<FileNotFoundException> <@ File.GetAttributes("non-existing.file") @> 

duży apartament NUnit za przeciążeń asercjami z czasem nieoczekiwane zachowanie wykonawcze zostały zaprojektowane w celu skompensowania względnym brakiem wyrazistości w porównaniu do F # C# 's.

On-the-drugiej ręki, ponieważ F # jest już wyposażony w funkcje, takie jak porównanie strukturalnej elegancko wyrażających twierdzeń, koniec cytatu jest zaprojektowany w celu wykorzystania jego natywne funkcje z zaledwie trzech prostych operatorów asercjami: test, raises i raisesWith.

+0

+1 za wzmiankę o Unquote. –

+0

To bardzo interesujące, ponieważ pierwsza sprawa, którą wypróbowałem, była nieważna. Niestety połączenie NUnit i nonquote nie przyniosło mi żadnych efektów, więc wróciłem do NUnit. Podsumowałem problem, który miałem z NUnit i nie opublikowałem go i opublikowałem jako [inne pytanie] (http://stackoverflow.com/questions/13846561/missingmethodexception-when-using-unquote-asserts), twoja pomoc w tym być docenionym. –

+0

Niestety @SergeBelov, to niefortunne! Dodałem komentarz do Twojego nowego pytania. Uważam, że problem, który masz, nie jest związany z Unquote per se, ale jest to raczej problem z ładowaniem/konfiguracją zestawu testów NUnit lub czymś podobnym. –

Powiązane problemy