2017-01-04 6 views
0

私のログ警告メッセージがNUnitモッキングで書かれているかどうかを確認しようとしていました。型「System.NotSupportedException」の例外がMoq.dllで発生したが、ユーザーコードでASP.NETコアで私にエラーが発生した模擬ロガー

追加情報を扱っていなかった

:無効は非仮想に確認してください私は、このエラーメッセージを取得しています(VBでオーバーライド)メンバー:m => m.LogWarning(String.Format("comments not found for part number :{0}", (Object)0), new[] { "111" }

コード:

mockLogger.Verify(m => m.LogWarning($"comments not found for part number :{0}", "111"), Times.Exactly(1)); 

これが起こっているためモッキングフレームワークは拡張メソッドをサポートしていません。スタックオーバーフローに関する少数の人々は、レベルワイズメソッドの代わりにLogメソッドを使用することを提案しています。

私には何が欠けていますか?

答えて

0

まず、文字列の先頭に$は必要ありません。これは文字列補間のためのものです。 LogWarningメッセージはstring.formatを実行しているため、{0}

モックフレームワークは静的メソッドを直接モックできません。あなたの場合の問題は、LogWarningメソッドです。これは静的(拡張)メソッドです。

この問題を解決する最も簡単な方法は、ラッパークラスを使用することです。あなたの場合、私はそれをどうやって得るのですか?

は、まず私が実装するクラスを作成した後インタフェース

public interface IMyLogWarning 
{ 
    void LogWarning(string msg, params object[] args); 
} 

を作成し、そのインターフェース

public class MyLogWarning<T> : IMyLogWarning where T : class 
{ 
    private readonly ILogger _logger; 

    public MyLogWarning(ILogger<T> logger) 
    { 
     // Using constructor for DI 
     _logger = logger; 
    } 

    public void LogWarning(string msg, params object[] args) 
    { 
     _logger.LogWarning(msg, args); 
    } 
} 

これら二つの理由は、私は私のコードでこれらを使用するだけでなく、だろうということですユニットテスト。

クラス内のコンストラクタは、ConfigureServicesメソッドで依存性注入を使用して設定できるようにセットアップされています。これを自由に変更してください。私はそれを素早く刺していた。

services.AddTransient<IMyLogWarning, MyLogWarning<MyViewModel>>(); 

次に、あなたの答えは、この

[Test] 
public void LoggingTest_LogAMessage_ConfirmedLogWasRun() 
{ 
    // TODO - add the rest of your test code 

    // Arrange 
    var warningMsg = "comments not found for part number :{0}"; 
    var partNumber = "111"; 
    var mockLogger = new Mock<IMyLogWarning>(); 

    // Act 
    mockLogger.Object.LogWarning(warningMsg, partNumber); 

    // Assert 
    mockLogger.Verify(m => m.LogWarning(warningMsg, partNumber), Times.Exactly(1)); 
} 
+0

感謝のようなおおよそのユニットテストを作成することができます – user2315952

+0

@ user2315952あなたがそれを使用している場合(それは、緑色のチェックマークを取得します)答えを受け入れてください。 – bcnzer

関連する問題