2016-09-20 7 views
10

ログに記録されたログを確認したい。私は内蔵のILoggerですasp.netコアを使用して、内蔵のDI asp.netコアでそれを注入しています:asp.netコア内蔵のIloggerをテストするには

private readonly ILogger<InvoiceApi> _logger; 

public InvoiceApi(ILogger<InvoiceApi> logger) 
{ 
    _logger = logger; 
} 

その後、私は次のようにそれを使用する:_logger.LogError("error));

私はそれを嘲笑してみましたいつものように(MOQ有する)によって:

MockLogger = new Mock<ILogger<InvoiceApi>>(); 

によって試験のためのサービスでこれを注入:トライ次いで

new InvoiceApi(MockLogger.Object); 

D検証:

MockLogger.Verify(m => m.LogError(It.Is<string>(s => s.Contains("CreateInvoiceFailed")))); 

が、それは投げる:

無効は非仮想(オーバーライドVBで)メンバーに確認してください:だからメートル=> m.LogError

、どのようにすることができますこのログが記録されたことを確認しますか?

+0

あなたの特定の問題を明確にしたり、必要な正確に何を強調表示するために、追加の詳細情報を追加してください。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。この質問を明らかにするには、[How to Ask](http://stackoverflow.com/help/how-to-ask)ページを参照してください。 – Nkosi

+0

最後に行を追加しました。今問題は明らかですか? – arielorvits

+0

あなたは、ロガーを使用している状況では表示されていません。テスト中のシステム/メソッドを表示します。ロガーがどのように注入され使用されているかを示します。 – Nkosi

答えて

17

@ Nkosi'veは既に言っていますが、あなたは拡張メソッドをモックできません。あなたは何か模擬はthe ILogger.Log methodです。これはLogError calls intoです。私は、様々な手法を示すshort articleを書いた

MockLogger.Verify(
    m => m.Log(
     LogLevel.Error, 
     It.IsAny<EventId>(), 
     It.Is<FormattedLogValues>(v => v.ToString().Contains("CreateInvoiceFailed")), 
     It.IsAny<Exception>(), 
     It.IsAny<Func<object, Exception, string>>() 
    ) 
); 

(これはコンパイルするかどうかわからないが、あなたはその要旨を取得)

+1

です!唯一のことは最後から2番目の引数として 'It.IsAny ()'を追加することです。 –

+0

.LogErrorの代わりに.Logを使用してくれてありがとう@khellang! –

1

LogErrorはインスタンスメソッドではなく、拡張メソッド(静的)です。静的メソッド(したがって拡張メソッド)をモックフレームワークで「直接」モックすることはできないため、Moqはそのメソッドをモックして検証することができません。私は目標インターフェイスを適用/ラッピングし、それについてあなたのモックを行うことについての提案をオンラインで見たことがありますが、多くの場所でコード全体にデフォルトの​​を使用した場合は書き換えを意味します。ラッパークラス用とモック可能インターフェイス用の2つの新しいタイプを作成する必要があります。

1

、:それは検証コードが少し不格好になり、それが動作するはずですここでの他の回答に記載されているように、基礎となるLog()メソッドを嘲笑することも含まれます。記事にはa full GitHub repo with each of the different optionsが含まれています。結局、ILoggerタイプで直接作業するのではなく、自分のアダプタを使用することをお勧めします。

https://ardalis.com/testing-logging-in-aspnet-core

関連する問題