2012-01-27 21 views
16

Microsoft Test FrameworkとMoqを使用して、log4netメソッドが呼び出されたかどうかを確認しようとしています。moqの設定とメソッドの呼び出しの確認

[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()); 

    } 

私は

が少なくとも一度モックの呼び出しを期待することを言って確認し、コールの例外を得るが、 行われていませんでした:moqLog => moqLog.Info(「ものが呼ばれましたか」 )設定なし が設定されています。呼び出しは実行されません。

私は間違っていますか?

更新問題は、SampleClas.Logプロパティのゲッターにあります。プロパティが既にILogProxyに設定されていても、私はいつもLogManager.GetLogger(...);を返していました。私はそのようなプロキシを設定しているため、プロパティのアクセサーが呼び出されないという印象を受けましたsampleObject.Log = logMockObject.Object;

+0

は.INFOに渡される正確な文字列「ものが呼ばれましたか」となっていますか? –

+1

'sampleObject.DoStuffAndLogInfo()'は何をしますか? –

+0

パラメータは重要ですか?あなたが何かを渡している限り、パラメータは重要ではないと思った。 –

答えて

1

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

を確認し、実際にDoStuffAndLogInfoメソッド内でLog.Infoが呼び出されているかどうかを確認してください。

+0

私はこの答えに同意します。あなた自身の心を与えるために、私のSampleClassで同じテストを実行すると、テストが成功することがわかります。 'public class SampleClass {public void Log(ILog log){log.Warn(" do stuff got called ");} }} ' –

+0

@JohnRuiz正解、私もこのようなクラスを使用しました - ' Warn'ではなく 'Info'だけです – GolfWolf

+0

意味があります。私はこの変更を行いましたが、私はまた別の変更を加えなければなりませんでした。質問の私の更新を見てください。 –

32

今の部品番号は正確な文字列DoStuffAndLogInfo通話Infoは「ものが呼ばれましたか」ということを確認しています。それは実際には別の引数でInfoを呼んだ、とあなたは、実際の引数が何であるかを気にしない場合は、代わりに次のようにします。

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
+0

意味があります。私はこの変更を行いましたが、私はまた別の変更を加えなければなりませんでした。質問の私の更新を見てください。 –

+0

ログ用に模擬を作成しましたが、 'SampleClass'用に作成しませんでした。 'SampleClass.DoStuffAndLogInfo'が' this.Log'にアクセスすると、 'SampleClass.Log'のために' get'アクセサを呼び出します。 –

関連する問題