犀牛制品 - 使用上Common.Logging ILog.Debug AssertWasCalled
-
20-09-2019 - |
题
我使用犀牛制品断言一方法被调用(并且理想地与特定的参数),其具有的麻烦。该方法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工作正常。