簡體   English   中英

Rhino Mocks-在Common.Logging ILog.Debug上使用AssertWasCalled

[英]Rhino Mocks - using AssertWasCalled on Common.Logging ILog.Debug

我在使用Rhino Mocks斷言某個方法被調用時遇到麻煩(理想情況下使用特定參數)。 方法是使用新的lamba語法的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"))));
    }

我在這里假設您只是在修改Rhinomocks,這與日志記錄框架無關,對嗎? 我之所以這樣說,是因為您的測試中沒有具體的實現,只有模擬。

如果不測試您的代碼,此行看起來將始終為零:

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

因為您的實際方法TestFunc()將字符串傳遞給log.Debug,而不是FormatMessageHandler:

因此,通話次數為零是有意義的。 像這樣在TestFunc()中添加一行:

log.Debug(new FormatMessageHandler());

看看是否能解決問題。

首先,創建一個具體的類以查看是否在TestFuncLambda中調用了正確的Debug()方法。 這可以確保它不會對lambda進行某種奇怪的轉換。

一旦確認應該調用正確的版本,就可以隔離RhinoMocks的問題。 犀牛模擬可能是一個錯誤。 因此,讓我們減少故障集,但在將lambda傳遞給Debug之前,將其包裝在新的FormatMessageHandler()中。 這樣可以確保正確的模擬函數被調用,而不被翻譯為其他函數。

如果此時還沒有發現錯誤,但仍然無法正常工作,請嘗試創建FormatMessageHandler()的實例並將其保存為靜態成員變量(以測試有什么問題)。 將保存在TestFuncDebug調用中的變量傳遞給Debug()和AssertWasCalled()調用。 如果那不起作用,那我就沒主意了。

順便說一句,我不知道是什么IgnoreArguments()是,但我從來沒有把它叫我RhinoMocks調用AssertWasCalled。 通常讓Arg <>。Is.Anything可以正常工作。

我想到了。 我缺少代表的“操作”部分。 正確的語法是:

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

而不是

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

如前所述,o.IgnoreArguments()是多余的,不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM