:あなたはxUnit.net 1.xのを使用した場合は、以前Console
、Debug
、または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
フレームワークを統合する必要があるXunitLoggerProvider
とXunitLogger
です:
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()
{ }
}
}
ありがとうございました。 1)私はユニットテストではないことを知っています。ここでの統合テストで何をしたいのですが、いくつかのクエリがローカルで評価されるときにEntity Frameworkが記録する警告を見ることです。私は質問を更新します。 2)私はあなたのクラスを引きつけました。 XunitLoggerのLogメソッドが呼び出され、OmniSharpログに不正な形式の出力が表示されますが、ドットネットテストを実行すると.NETテストログや端末の出力には表示されません。 – Max
@Maxコンソールランナーからの出力を見るには、 'dotnet-xunit' CLIツールを使用する必要があります(' dotnet test'はそれには十分強力ではありません)。 'dotnet xunit -diagnostics'を実行します。 Visual Studioでも出力は自動的に正しく表示されます。 – poke
'dotnet test -v n'のためにも動作します – Max