2017-01-18 16 views
1

У меня есть проект C# в .NET Core с модульными тестами. Чтобы лучше изучить поток через код во время теста, мне бы очень хотелось увидеть вывод сообщений NLog, встроенных в базу кода.Есть ли способ увидеть сообщения журнала, сгенерированные в модульном тесте в .NET Core?

Я использую XUnit, и я знаю, что XUnit отошел от сообщений консоли из-за параллельного выполнения теста. Для того, что я хочу сделать с помощью ITestOutputHelper, это будет не очень полезно.

Есть ли способ получить регистрацию NLog для включения в тестовый результат?

ответ

1

я использую что-то вроде этого:

namespace Tests.Builders 
{ 
    internal static class Logging 
    { 
     public static ILogger DefaultLogger() 
     { 
      return NullLogger(); 
     } 

     public static ILogger NullLogger() 
     { 
      return Substitute.For<ILogger>(); 
     } 

     public static ILogger XUnitLogger(ITestOutputHelper testOutputHelper) 
     { 
      // Step 1. Create configuration object 
      var config = new LoggingConfiguration(); 

      // Step 2. Create targets and add them to the configuration 
      var consoleTarget = new XUnitTarget(testOutputHelper); 
      config.AddTarget("xunit", consoleTarget); 

      // Step 3. Set target properties 
      consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"; 

      // Step 4. Define rules 
      var rule1 = new LoggingRule("*", LogLevel.Trace, consoleTarget); 
      config.LoggingRules.Add(rule1); 

      // Step 5. Activate the configuration 
      LogManager.Configuration = config; 

      return LogManager.GetLogger(""); 
     } 
    } 

    [Target("XUnit")] 
    public sealed class XUnitTarget : TargetWithLayout 
    { 
     private readonly ITestOutputHelper _output; 

     public XUnitTarget(ITestOutputHelper testOutputHelper) 
     { 
      _output = testOutputHelper; 
     } 

     protected override void Write(LogEventInfo logEvent) 
     { 
      string logMessage = this.Layout.Render(logEvent); 

      _output.WriteLine(logMessage); 
     } 
    } 
} 

public class SomeTests 
{ 
    private readonly ITestOutputHelper _output; 

    public SomeTests(ITestOutputHelper output) 
    { 
     _output = output; 
    } 

    [Fact] 
    public void Lets_see_some_output() 
    { 
     var foo = new Foo(Logging.XUnitLogger(_output)); 

     var result = foo.ExecuteSomething(); 

     Assert.Equal(true, result); 
    } 
}