[英]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.