まず、文字列の先頭に$は必要ありません。これは文字列補間のためのものです。 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));
}
感謝のようなおおよそのユニットテストを作成することができます – user2315952
@ user2315952あなたがそれを使用している場合(それは、緑色のチェックマークを取得します)答えを受け入れてください。 – bcnzer