Rhinoのモック - Common.Logging ILog.DebugにAssertWasCalledを使用して
-
20-09-2019 - |
質問
私はこの方法は、(理想的には、特定のパラメータを持つ)と呼ばれていたことを主張するためにRhinoのモックを使用してトラブルを抱えています。方法は共通でILog.Debug(FormatMessageHandler)です。新しいラムダ構文を使用して2.0 のロギング。それは古い方法平野ILog.Debug(文字列)を使用して正常に動作します。
// Sample Code to Test
public int TestFuncLambda(ILog log, int a, int b)
{
log.Debug(m => m("TestFunc START"));
int c = a + b;
log.Debug(m => m("TestFunc END"));
return c;
}
public int TestFunc(ILog log, int a, int b)
{
log.Debug("TestFunc START");
int c = a + b;
log.Debug("TestFunc END");
return c;
}
[TestMethod]
public void Should_log_start_TestFuncLamba()
{
var logger = MockRepository.GenerateMock<ILog>();
logger.Stub(x => x.IsDebugEnabled).Return(true);
TestFuncLambda(logger, 1, 2);
// Doesn't work, says zero calls plus I'm not sure how to check for the word "START" in the string either
logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());
}
[TestMethod]
public void Should_log_start_TestFunc()
{
var logger = MockRepository.GenerateMock<ILog>();
logger.Stub(x => x.IsDebugEnabled).Return(true);
TestFunc(logger, 1, 2);
// Works fine
logger.AssertWasCalled(x => x.Debug(Arg<string>.Matches(Text.Contains("START"))));
}
解決 3
私はそれを考え出しました。私は、デリゲートのためのアクション部分が欠落していました。適切な構文があります:
logger.AssertWasCalled(x => x.Debug(Arg<Action<FormatMessageHandler>>.Is.Anything));
ではなく
logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());
上述o.IgnoreArguments()に必要な冗長ではありませんでした。
他のヒント
私はあなただけRhinomocksいじりされていることを、ここで前提とするつもりだ、これはロギングフレームワークとは何の関係もない、ということは正しいでしょうか?あなたのテストでは、唯一のモックには具体的な実装が存在しないので、私はこれを言うます。
それは常にゼロになりますようには、あなたのコードをテストしないと、この行が見えます:
logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());
は、あなたの実際の方法TestFuncは()log.Debugに文字列を渡すため、およびないFormatMessageHandlerます:
だから、呼び出しの数がゼロであることを意味するだろう。このようなTestFunc()に行を追加します:
log.Debug(new FormatMessageHandler());
とそれはそれを修正するかどうかを確認します。
まず、右のデバッグ()メソッドがTestFuncLambdaに呼び出されているかどうかを確認するために、具体的なクラスを作成します。 これは、文字列にラムダの奇妙な変換のいくつかの並べ替えを行っていないことを確認します。
あなたが正しいバージョンを呼び出すべきであるされていることを確認したら、、あなたはRhinoMocksの問題を分離しました。これは、サイのモックのバグである可能性があります。だから、セット不良を低減いますが、デバッグにそれを渡す前に、新しいFormatMessageHandler()でラムダをラップすることができます。これは、右の嘲笑関数が呼び出されると、何か他のもののように翻訳されていないされていることを保証します。
(単に間違っているかをテストするために)あなたはこの時点でバグを発見していない、そしてそれはまだ動作しません、FormatMessageHandler(のインスタンスを作成してみてください)と静的メンバ変数として保存した場合。それは、デバッグ()およびAssertWasCalled()の呼び出しにTestFuncDebug呼び出しでの保存に渡します。それでも解決しない場合は、私がアイデアをしています。
ところで、私は)何IgnoreArguments(知らないですが、私はRhinoMocksがAssertWasCalledに呼び出して、私の中でそれを呼び出す必要はありません。通常のArg <>を有する。Is.Anything正常に動作します。