2015-08-12 4 views
8

Обычно я пишу мои тесты единицы в F #, какКак захватить выход с XUnit 2.0 и испытаний типа 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 @> 

Если я хочу, чтобы войти в консоль из XUnit (по http://xunit.github.io/docs/capturing-output.html) нужно написать конструктор, который принимает ITestOutputHelper, а затем использовать это вместо Console.WriteLine и семейства.

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

Однако модули fsharp являются статическими классами, а тесты являются статическими методами. Нет конструктора для ввода выходного помощника.

Есть ли способ получить доступ к текущему выходному помощнику для текущего теста. Я знаю, что могу переписать мои тесты fsharp как нестатические классы, но это нежелательно.

После просмотра источника XUnit.

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

Я уверен, что это упускается случай. Встает помощник в статические классы.

+1

Может ли это работать вместо вас? http://stackoverflow.com/a/2139303/126014 Вы не пишете о мотивации к желанию захватить вывод, поэтому он может не применяться, но я думал, что хочу указать на этот вариант, на всякий случай. –

ответ

8

Если у xUnit нет альтернативного механизма для ввода параметров, то, я думаю, единственным вариантом является определение тестов как методов в типе объекта F #. Я также предпочитаю написание тестов как функции с использованием let, но следующий простой тип объекта не выглядит так уж плохо:

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

Было бы хорошо, если XUnit поддерживается какой-то другой вариант для этого - я подозреваю, что они могут быть открыты предложения, если это что-то, что не было бы слишком неудобным (возможно, используя параметр метода?)

Но если xUnit не поддерживает поддержку какого-либо другого метода, я думаю, вам нужно будет использовать объект F # с методами.

+0

Спасибо, Томас, он отлично работал :) –

Смежные вопросы