2017-09-12 26 views
3

私の.NET Core 2.0プロジェクトでの私のxUnit統合テストでは、テスト結果をプリントするログメッセージが端末に表示されません。 WebHost環境でコードを実行すると、ログがコンソールに出力されます。.netコア2.0 ConfigureLogging xunitテスト

これは、私がテストのコンストラクタでログインを設定する方法です:

var config = new ConfigurationBuilder() 
    .AddJsonFile("appsettings.Tests.json") 
    .Build(); 

var services = new ServiceCollection(); 

services.AddLogging(options => { 
    options.AddConfiguration(config.GetSection("Logging")); 
    options.AddConsole(); 
    options.AddDebug(); 
}); 

var serviceProvider = services.BuildServiceProvider(); 
var loggerFactory = serviceProvider.GetService<ILoggerFactory>(); 
var logger = loggerFactory.CreateLogger("Test"); 
logger.LogError("From ctor"); 

しかし、私はすべてのログメッセージが表示されません。

のxUnitは、もはやテストのための標準出力をキャプチャするために、バージョン2に変更されていない

答えて

7

:あなたはxUnit.net 1.xのを使用した場合は、以前ConsoleDebug、またはTraceに出力を書き込みされている可能性があり

。 xUnit.net v2がデフォルトで並列化がオンになって出荷されたとき、この出力キャプチャメカニズムはもはや適切ではありませんでした。並行して実行できる多くのテストのどれが共有リソースへの書き込みを担当していたのかを知ることは不可能です。

代わりに、an explicit mechanismの2つの書き込みテスト出力を使用することになっています。基本的に、コンソールに書き込む代わりに、特別なITestOutputHelperに書き込んでいます。

もちろん、この出力メカニズムはASP.NETコアロギングではデフォルトではサポートされていません。幸いにも、テスト出力用のロギングプロバイダを作成することはあまり難しくありません。私はちょうど速いプロバイダを実装し、私の答えにそれを含めた。

public class Example 
{ 
    private readonly ILogger<Example> _logger; 

    public Example(ITestOutputHelper testOutputHelper) 
    { 
     var loggerFactory = new LoggerFactory(); 
     loggerFactory.AddProvider(new XunitLoggerProvider(testOutputHelper)); 
     _logger = loggerFactory.CreateLogger<Example>(); 
    } 

    [Fact] 
    public void Test() 
    { 
     _logger.LogDebug("Foo bar baz"); 
    } 
} 

通常、ユニットテストでは完全な依存性注入コンテナを作成しないでください。単位テストでDIを持つのは、通常、単位テストが単位テストではなく、統合テストではないという兆候です。単体テストでは、特定のユニットを1つしかテストせず、すべての依存関係を明示的に渡す必要があります。上の例で分かるように、ロガーの作成は、実際にDIなしで行うことは非常に簡単です。


約束通り、これはあなたが上記のコードを実行するために、とのxUnitテスト出力でMicrosoft.Extensions.Loggingフレームワークを統合する必要があるXunitLoggerProviderXunitLoggerです:

public class XunitLoggerProvider : ILoggerProvider 
{ 
    private readonly ITestOutputHelper _testOutputHelper; 

    public XunitLoggerProvider(ITestOutputHelper testOutputHelper) 
    { 
     _testOutputHelper = testOutputHelper; 
    } 

    public ILogger CreateLogger(string categoryName) 
     => new XunitLogger(_testOutputHelper, categoryName); 

    public void Dispose() 
    { } 
} 

public class XunitLogger : ILogger 
{ 
    private readonly ITestOutputHelper _testOutputHelper; 
    private readonly string _categoryName; 

    public XunitLogger(ITestOutputHelper testOutputHelper, string categoryName) 
    { 
     _testOutputHelper = testOutputHelper; 
     _categoryName = categoryName; 
    } 

    public IDisposable BeginScope<TState>(TState state) 
     => NoopDisposable.Instance; 

    public bool IsEnabled(LogLevel logLevel) 
     => true; 

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) 
    { 
     _testOutputHelper.WriteLine($"{_categoryName} [{eventId}] {formatter(state, exception)}"); 
     if (exception != null) 
      _testOutputHelper.WriteLine(exception.ToString()); 
    } 

    private class NoopDisposable : IDisposable 
    { 
     public static NoopDisposable Instance = new NoopDisposable(); 
     public void Dispose() 
     { } 
    } 
} 
+0

ありがとうございました。 1)私はユニットテストではないことを知っています。ここでの統合テストで何をしたいのですが、いくつかのクエリがローカルで評価されるときにEntity Frameworkが記録する警告を見ることです。私は質問を更新します。 2)私はあなたのクラスを引きつけました。 XunitLoggerのLogメソッドが呼び出され、OmniSharpログに不正な形式の出力が表示されますが、ドットネットテストを実行すると.NETテストログや端末の出力には表示されません。 – Max

+0

@Maxコンソールランナーからの出力を見るには、 'dotnet-xunit' CLIツールを使用する必要があります(' dotnet test'はそれには十分強力ではありません)。 'dotnet xunit -diagnostics'を実行します。 Visual Studioでも出力は自動的に正しく表示されます。 – poke

+1

'dotnet test -v n'のためにも動作します – Max

関連する問題