2015-08-12 14 views
8

Normalerweise, wie ich meine Unit-Tests in F # schreibenWie erfassen Ausgabe mit XUnit 2.0 und FSharp Stil Tests

open Swensen.Unquote 
open Xunit 

module MyTests = 

    [<Fact>] 
    let ``SomeFunction should return 10``() = 
     let a = SomeFunction() 
     test <@ a = 10 @> 


    [<Fact>] 
    let ``SomeOtherFunction should return 11``() = 
     let a = SomeFunction() 
     test <@ a = 11 @> 

Wenn ich an die Konsole von xunit anmelden möchten (nach http://xunit.github.io/docs/capturing-output.html) braucht man eine schreiben Konstruktor, der ein ITestOutputHelper nimmt und dann das anstelle von Console.WriteLine und Familie verwendet.

using Xunit; 
using Xunit.Abstractions; 

public class MyTestClass 
{ 
    private readonly ITestOutputHelper output; 

    public MyTestClass(ITestOutputHelper output) 
    { 
     this.output = output; 
    } 

    [Fact] 
    public void MyTest() 
    { 
     var temp = "my class!"; 
     output.WriteLine("This is output from {0}", temp); 
    } 
} 

jedoch fsharp Module sind statische Klassen und die Tests sind statische Methoden. Es gibt keinen Konstruktor, der den Ausgabe-Helper injiziert.

Gibt es eine Möglichkeit, Zugriff auf den aktuellen Ausgabe-Helper für den aktuellen Test zu erhalten. Ich weiß, dass ich meine fsharp Tests schreiben könnte, um nicht statische Klassen zu sein, aber das ist unerwünscht.

Nach dem Blick auf die XUnit-Quelle.

https://github.com/xunit/xunit/blob/e64f566b75f93cd3cec27f950759d82832bfe44b/src/xunit.execution/Sdk/Frameworks/Runners/TestClassRunner.cs#L90

Ich bin mir ziemlich sicher, dass dies ein übersehener Fall. Es gibt keine Injektion des Helfers in statische Klassen.

+1

Könnte das stattdessen für Sie arbeiten? http://StackOverflow.com/a/2139303/126014 Sie schreiben nicht über die Motivation, die Ausgabe zu erfassen, so dass es möglicherweise nicht gilt, aber ich dachte, ich wollte auf diese Option hinweisen, nur für den Fall. –

Antwort

8

Wenn xUnit keinen alternativen Mechanismus für die Injektion der Parameter hat, dann ist die einzige Option, die Tests als Methoden in einem F # -Objekttyp zu definieren. Ich ziehe auch das Schreiben von Tests als Funktionen let verwenden, aber der folgende einfache Objekttyp sieht nicht allzu schlecht:

open Swensen.Unquote 
open Xunit 
open Xunit.Abstractions 

type MyTests(output:ITestOutputHelper) = 

    [<Fact>] 
    member __.``SomeFunction should return 10``() = 
     let a = SomeFunction() 
     output.WriteLine("Some function returned {0}", a) 
     test <@ a = 10 @> 

Es wäre schön, wenn xUnit eine andere Option für diese unterstützt - ich vermute, dass sie offen sein könnten, Vorschläge, wenn es etwas ist, das nicht zu peinlich wäre (vielleicht mit einem Methodenparameter?)

Aber es sei denn, xUnit fügt Unterstützung für eine andere Methode hinzu, ich denke, Sie müssen F # -Objekt mit Methoden verwenden.

+0

Danke Tomas, es hat perfekt funktioniert :) –