0

我在使用 Rhino Mocks 来断言调用了一个方法时遇到了问题(理想情况下是使用特定参数)。方法是 Common.Logging 2.0中的 ILog.Debug(FormatMessageHandler) 使用新的 Lamba 语法。使用旧方式普通的 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

我在这里假设您只是在修补 Rhinomocks,这与日志框架无关,对吗?我这样说是因为您的测试中没有具体的实现,只有模拟。

在不测试您的代码的情况下,这一行看起来总是为零:

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

因为您的实际方法 TestFunc() 将字符串传递给 log.Debug,而不是 FormatMessageHandler:

因此,调用次数为零是有道理的。像这样向 TestFunc() 添加一行:

log.Debug(new FormatMessageHandler());

看看是否可以解决它。

于 2009-12-22T02:51:30.893 回答
0

首先,创建一个具体的类来查看是否在 TestFuncLambda 中调用了正确的 Debug() 方法。这确保它不会将 lambda 转换为字符串。

一旦您确认应该调用正确的版本,您就已经隔离了 RhinoMocks 的问题。这可能是犀牛模拟的错误。因此,让我们减少失败集,但在将 lambda 传递给 Debug 之前将其包装在新的 FormatMessageHandler() 中。这确保了正确的模拟函数被调用而不是被翻译为其他东西。

如果此时您还没有发现错误,并且仍然无法正常工作,请尝试创建 FormatMessageHandler() 的实例并将其保存为静态成员变量(只是为了测试有什么问题)。将保存在 TestFuncDebug 调用中的内容传递给 Debug() 和 AssertWasCalled() 调用。如果这不起作用,我没有想法。

顺便说一句,我不知道 IgnoreArguments() 是什么,但我不必在 RhinoMocks 调用 AssertWasCalled 时调用它。通常有 Arg<>.Is.Anything 工作正常。

于 2009-12-22T04:00:09.053 回答
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 回答