web-dev-qa-db-ja.com

moqを設定し、メソッドが呼び出されたことを確認します

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アクセサーが呼び出されないという印象を受けました。

17
dev.e.loper

現在MoqはDoStuffAndLogInfoInfo正確な文字列 "do stuff got got"で呼び出していることを確認しています。実際に別の引数でInfoを呼び出していて、実際の引数が何であるかを気にしない場合は、代わりに次を使用してください。

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
35
Michael Liu

テストは正しく設定されています。

sutをチェックして、Log.Infoは実際にはDoStuffAndLogInfoメソッド内で呼び出されます。

1

これは元の投稿者の問題ではないようですが、私の場合は非常によく似たエラーメッセージが表示されました。それは私の.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()); 
0