2009-12-22 31 views
0

我無法使用Rhino Mocks來聲明一個方法被調用(並且理想地使用特定參數)。方法是使用新的lamba語法在Common.Logging 2.0中的ILog.Debug(FormatMessageHandler)。它工作正常使用舊的方式普通ILog.Debug(字符串)。Rhino Mocks - 在common.Logging上使用AssertWasCalled 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")))); 
    } 

回答

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()是多餘的和不必要的。

0

我在這裏假設你只是在修補Rhinomocks,而這與日誌框架無關,是對的嗎?我這樣說是因爲在你的測試中沒有具體的實現,只是嘲笑。

沒有測試代碼,這一行看起來永遠是零:

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

,因爲你的實際方法TestFunc()把字符串log.Debug,而不是FormatMessageHandler:

所以通話次數爲零是有意義的。添加一行到TestFunc()像這樣:

log.Debug(new FormatMessageHandler()); 

並查看是否修復它。

+0

我在我剛剛修復的示例中有一些拼寫錯誤。是的,這只是一個例子的簡單測試。 TestFunc的工作原理,TestFuncLamba沒有。希望現在更清楚。 – ss2k 2009-12-22 03:31:55

0

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

一旦你確認應該調用正確的版本,你已經隔離了RhinoMocks的問題。這可能是一個與犀牛嘲笑的錯誤。因此,在將它傳遞給Debug之前,讓我們減少失敗集,但將lambda包裝在新的FormatMessageHandler()中。這確保了正確的模擬函數被調用,而不是被翻譯爲別的東西。

如果您在這一點上還沒有找到缺陷,但它仍然無法正常工作,請嘗試創建FormatMessageHandler()實例並將其保存爲靜態成員變量(僅用於測試出現錯誤)。傳遞TestFuncDebug調用中保存的Debug()和AssertWasCalled()調用。如果這不起作用,我就沒有想法。

順便說一句,我不知道什麼IgnoreArguments()是,但我永遠不必在我的RhinoMocks調用AssertWasCalled調用它。通常有Arg <> .Is.Anything工作正常。