2015-08-12 16 views
8

Normalmente scrivo il mio test di unità in F # comeCome per acquisire l'output con xUnit 2.0 e prove di stile FSharp

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 @> 

Se voglio accedere alla console da xUnit (secondo http://xunit.github.io/docs/capturing-output.html) si ha la necessità di scrivere un costruttore che prende un ITestOutputHelper e quindi usa quello al posto di Console.WriteLine e famiglia.

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); 
    } 
} 

tuttavia i moduli fsharp sono classi statiche ei test sono metodi statici. Non c'è costruttore per iniettare l'helper di output.

C'è un modo per accedere all'assistente di output corrente per il test corrente. So che potrei riscrivere i miei test di fsharp come classi non statiche, ma questo è indesiderato.

Dopo aver esaminato la fonte XUnit.

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

Sono abbastanza sicuro che questo è un caso trascurato. Non c'è iniezione dell'helper in classi statiche.

+1

Potrebbe questo lavoro per voi, invece? http://stackoverflow.com/a/2139303/126014 Non si scrive sulla motivazione per voler catturare l'output, quindi potrebbe non essere applicabile, ma ho pensato che volevo indicare quell'opzione, per ogni evenienza. –

risposta

8

Se xUnit non dispone di alcun meccanismo alternativo per l'iniezione dei parametri, quindi suppongo che l'unica opzione sia definire i test come metodi in un tipo di oggetto F #. Anch'io preferisco scrivere i test come funzioni utilizzando let, ma il seguente tipo di oggetto semplice non sembra troppo male:

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 @> 

Sarebbe bello se xUnit supportato qualche altra opzione per questo - ho il sospetto che potrebbero essere aperti a suggerimenti, se è qualcosa che non sarebbe troppo complicato (magari usando un parametro di metodo?)

Ma a meno che xUnit non aggiunga il supporto per qualche altro metodo, penso che sarà necessario utilizzare l'oggetto F # con i metodi.

+0

Grazie Tomas, ha funzionato perfettamente :) –