0

Rhino Mocks を使用してメソッドが呼び出されたことをアサートするのに問題があります (理想的には特定のパラメーターを使用して)。メソッドは、 Common.Logging 2.0のILog.Debug(FormatMessageHandler) で、新しいラムバ構文を使用します。古い方法の単純な ILog.Debug(string) を使用して正常に動作します。

    // 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"))));
    }
4

3 に答える 3

0

私はそれを考え出した。デリゲートのアクション部分がありませんでした。適切な構文は次のとおりです。

logger.AssertWasCalled(x => x.Debug(Arg<Action<FormatMessageHandler>>.Is.Anything));

それよりも

logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());

前述のように、o.IgnoreArguments()は冗長であり、必要ありませんでした。

于 2009-12-22T05:58:10.273 に答える
0

ここでは、あなたが Rhinomocks をいじっているだけで、ロギング フレームワークとは何の関係もないと仮定しますが、それでよろしいですか? テストには具体的な実装がなく、モックのみがあるため、これを言います。

コードをテストしないと、この行は常にゼロのように見えます。

logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());

実際のメソッド TestFunc() は、文字列を FormatMessageHandler ではなく log.Debug に渡すためです。

したがって、呼び出しの数がゼロであることは理にかなっています。次のように TestFunc() に行を追加します。

log.Debug(new FormatMessageHandler());

それが修正されるかどうかを確認します。

于 2009-12-22T02:51:30.893 に答える
0

まず、具象クラスを作成して、TestFuncLambda で正しい Debug() メソッドが呼び出されているかどうかを確認します。これにより、ラムダから文字列へのある種の奇妙な変換を行っていないことが保証されます。

正しいバージョンを呼び出す必要があることを確認したら、RhinoMocks の問題を切り分けました。rhino モックのバグである可能性があります。したがって、失敗セットを減らしましょう。ただし、ラムダを新しい FormatMessageHandler() でラップしてから、Debug に渡します。これにより、適切なモック関数が呼び出され、別のものとして変換されないことが保証されます。

この時点でバグが見つからず、それでも機能しない場合は、FormatMessageHandler() のインスタンスを作成し、それを静的メンバー変数として保存してみてください (何が問題なのかをテストするだけです)。Debug() への TestFuncDebug 呼び出しと AssertWasCalled() 呼び出しで保存されたものを渡します。それがうまくいかない場合、私はアイデアがありません。

ところで、IgnoreArguments() が何かはわかりませんが、RhinoMocks の AssertWasCalled 呼び出しで呼び出す必要はありません。通常 Arg<>.Is.Anything を使用すると問題なく動作します。

于 2009-12-22T04:00:09.053 に答える