6

Ich schreibe Komponententests für meine F # -Bibliothek mit F #, Visual Studio Unit Testing Framework (aka MSTest) und FluentAssertions.Wie wird der Methodenrückgabetyp 'void' in F # beibehalten?

Die Testmethode sollte den Rückgabetyp entweder void oder Task haben. In C#, das einfach:

[TestMethod] 
public void TestMethod1() 
{ 
    false.Should().BeFalse(); 
} 

in F # habe ich folgendes:

[<TestMethod>] 
member this.TestMethod1() = 
    false.Should().BeFalse(null) 
    |> ignore 

Ansonsten Rückkehr Typ FluentAssertions.PrimitivesBooleanAssertions so Test Runner geändert wird es nicht sehen.

Wie zu vermeiden, |> ignore am Ende jedes Tests zu haben?

Antwort

12

|> ignore zurückkehren wird benötigt hier, da die Signatur von TestMethod1 von "das Innere heraus" abgeleitet wird. Beachten Sie, dass in C# der Rückgabetyp einer Methode in der Methodendeklaration erforderlich ist. Das sind tiefe Unterschiede zwischen den Sprachen.

"Fließende" APIs sind ein Ärgernis in F #, da sie Instanzmethoden beinhalten, die beide einen Effekt haben und einen Wert zurückgeben, eine rote Markierung in F #. Das heißt, während Seiteneffekte in F # erlaubt sind, sind sie etwas in Quarantäne, sowohl in der Sprachspezifikation als auch in der Konvention. Es wird erwartet, dass eine Methode, die unit zurückgibt, eine Wirkung hat, aber umgekehrt wird erwartet, dass eine Methode, die einen Nichteinheitswert zurückgibt, rein ist.

Außerdem versuchen fließende APIs, Einschränkungen in Sprachen wie C# zu lösen, die F # nicht hat oder anders löst. Zum Beispiel ist in F # der Rohroperator + unveränderliche Datenstrukturtransformationen vergleichbar mit einer fließenden API in einer imperativen Sprache.

Versuchen Sie es mit einer idiomatischen F # -Einheit testen Assertion-Bibliothek, wie Unquote (Disclaimer, ich bin der Autor). Es nutzt viele der Stärken von F # auf die gleiche Weise wie FluentAssertions versucht, die Schwächen von C# auszugleichen.

+0

Vielen Dank! Vor allem für eine detaillierte Antwort. Ich werde deine lib kurz versuchen. – abatishchev

+0

BTW Warum haben Sie Google Code anstelle von Github oder Codeplex verwendet? Diese beiden sehen einen besseren Open-Source-Code-Hosting-Service für mich. – abatishchev

+0

@abatishchev nur Google Code unterstützt sowohl Mercurial als auch Subversion (SvnBridge zählt nicht), meine verteilten und zentralisierten VCSs der Wahl. Neben diesem Showstopper habe ich immer die einfache, aber mächtige Benutzeroberfläche von Google Code bevorzugt. Abgesehen davon beunruhigt mich die kürzlich erfolgte Einstellung des binären Hostings durch Google Code und der allgemeine Mangel an Weiterentwicklung. –

1

In F #, könnten Sie stattdessen FsUnit

Sie können nicht leer kommen in F #, Dank Götter versuchen! Wenn Sie |> ignore am Ende einer Methode verwenden, gibt die Methode unit zurück. In F #,

'System.Void' kann nur als 'typeof<System.Void>'

4

Fügen Sie einfach () am Ende Ihrer Funktion verwendet werden

Diese Einheit

+2

Dann bekomme ich eine Warnung: 'Dieser Ausdruck sollte den Typ 'Einheit' haben, aber hat den Typ 'AndConstraint '. Verwenden Sie "Ignorieren", um das Ergebnis des Ausdrucks zu verwerfen, oder "lassen", um das Ergebnis an einen Namen zu binden. – abatishchev