[xUnit] Переправить Debug.WriteLine() в ITestOutputHelper
От: VladCore  
Дата: 30.10.17 10:45
Оценка:
Хочется весь Debug.WriteLine переправлять в оутпут xUnit.

Посмотрел сюда https://xunit.github.io/docs/capturing-output.html и наколхозил класс DebugOutputAdapter:

    public class FirstTest
    {
        public FirstTest(ITestOutputHelper output)
        {
            DebugOutputAdapter.Bind(output);
        }

        [Fact]
        public void PassingTest()
        {
            Debug.WriteLine("Line 1: " + DateTime.Now);
            Thread.Sleep(4000);
            Debug.WriteLine("Line 2: " + DateTime.Now);
            Assert.Equal(4, Add(2, 2));
        }

        [Theory]
        [InlineData(3)]
        [InlineData(5)]
        [InlineData(6)]
        public void MyFirstTheory(int value)
        {
            Debug.WriteLine("Check theory using " + value);
            Assert.True(IsOdd(value));
        }

        bool IsOdd(int value)
        {
            return value % 2 == 1;
        }
    }

На удивление Resharper "плавно" показывает output в PassingTest. То есть сразу показывает

Line 1: 10/30/2017 1:25:17 PM


потом ждет 4 секунды и показывает

Line 2: 10/30/2017 1:25:21 PM


Вопрос. Как не писать в каждом-каждом тест-классе такой как выше конструктор?
        public Имя_Тест_Класса(ITestOutputHelper output)
        {
            DebugOutputAdapter.Bind(output);
        }


P.S. Понятно выполнение тестов надо сериализовывать что бы output не перемешивался.

P.P.S. и ещё вопрос — xUnit сортирует ли имена классов и методов при сериализации выполнения как и NUnit консольные и решарперовские раннеры?

  Сам банальный класс DebugOutputAdapter
    class DebugOutputAdapter
    {
        static ITestOutputHelper CurrentOutput = null;

        static DebugOutputAdapter()
        {
            Debug.Listeners.Add(new MyTraceListener());
        }

        public static void Bind(ITestOutputHelper output)
        {
            CurrentOutput = output;
        }

        class MyTraceListener : TraceListener
        {
            public override void Write(string message)
            {
            }

            public override void WriteLine(string message)
            {
                if (CurrentOutput != null)
                    CurrentOutput.WriteLine(message);
            }
        }
    }
Отредактировано 30.10.2017 10:50 VladCore . Предыдущая версия . Еще …
Отредактировано 30.10.2017 10:50 VladCore . Предыдущая версия .
Отредактировано 30.10.2017 10:46 VladCore . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.