Microsoft Test FrameworkとMoqを使用して、log4netメソッドが呼び出されたかどうかを確認しようとしています。
_ [TestMethod()]
public void Log_Info_When_Stuff_Is_Done()
{
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce());
}
_
ベリファイコールで例外が発生し、
少なくとも1回はモックでの呼び出しが必要ですが、実行されませんでした。moqLog=> moqLog.Info( "do stuff got call")セットアップは構成されていません。呼び出しは実行されませんでした。
私は何が間違っているのですか?
pdate問題は、SampleClas.Logプロパティのゲッターにありました。プロパティが既にILogProxyに設定されている場合でも、常にLogManager.GetLogger(...);
を返していました。 _sampleObject.Log = logMockObject.Object;
_のようなプロキシを設定したため、プロパティのgetアクセサーが呼び出されないという印象を受けました。
現在MoqはDoStuffAndLogInfo
がInfo
を正確な文字列 "do stuff got got"で呼び出していることを確認しています。実際に別の引数でInfo
を呼び出していて、実際の引数が何であるかを気にしない場合は、代わりに次を使用してください。
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
テストは正しく設定されています。
sutをチェックして、Log.Info
は実際にはDoStuffAndLogInfo
メソッド内で呼び出されます。
これは元の投稿者の問題ではないようですが、私の場合は非常によく似たエラーメッセージが表示されました。それは私の.Verify()
呼び出しbeforeの実際の実行によるものでした。たとえば、これは間違った:です。
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
....しかしこれは右:
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());