我使用犀牛制品断言一方法被调用(并且理想地与特定的参数),其具有的麻烦。该方法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的一个实例(并将其保存为静态成员变量(只是为了测试什么是错的)。传入,在TestFuncDebug调用保存上调试()和AssertWasCalled()调用。如果不工作,我的想法。

顺便说一句,我不知道是什么IgnoreArguments()是,但我从来没有把它叫我RhinoMocks调用AssertWasCalled。一般具有精氨酸<>。Is.Anything工作正常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top