2009-12-22 2 views
0

Rhino Mock을 사용하여 메서드가 호출되고 (이상적으로는 특정 매개 변수가있는 경우) 어설 션하는 데 문제가 있습니다. Method는 새로운 lamba 구문을 사용하는 Common.Logging 2.0의 ILog.Debug (FormatMessageHandler)입니다. 오래된 ILog.Debug (문자열)을 사용하면 잘 작동합니다.Rhino Mock - 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)); 

오히려()이 중복하고, 필요하지 않았다 바와 같이 o.IgnoreArguments

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

보다.

0

내가 방금 Rhinomocks 땜질하는 것을 가정한다거야, 이것은 로깅 프레임 워크와 아무 상관이 정확이 무엇입니까? 테스트에는 구체적인 구현이 없기 때문에 이것을 말하면됩니다. 그래서

: 실제 방법 TestFunc()가 FormatMessageHandler를 log.Debug에 문자열을 전달하고 있지 때문에

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

: 항상 0이됩니다 같은

은 당신의 코드를 테스트하지 않고,이 선 보인다 호출 수가 0 인 것은 당연합니다. 다음과 같이 TestFunc()에 라인을 추가하십시오 :

log.Debug(new FormatMessageHandler()); 

그리고이를 수정하는지 확인하십시오.

+0

방금 ​​수정 한 샘플에 약간의 오타가있었습니다. 예, 이것은 간단한 예제 일뿐입니다. TestFunc은 작동하지만 TestFuncLamba는 작동하지 않습니다. 지금 그게 더 명확 해지기를 바랍니다. – ss2k

0

먼저 TestFuncLambda에서 올바른 Debug() 메서드가 호출되는지 확인하기위한 구체적인 클래스를 만듭니다. 이렇게하면 람다를 문자열로 이상하게 변환하지 않을 것입니다.

올바른 버전을 호출해야하는지 확인한 후에는 RhinoMock으로 문제를 격리했습니다. 코뿔소 조롱범과 관련된 버그 일 수 있습니다. 따라서 오류 집합을 줄이거 나 Debug에 전달하기 전에 람다를 새로운 FormatMessageHandler()로 래핑 할 수 있습니다. 이렇게하면 올바른 조롱 된 함수가 호출되고 다른 것으로 변환되지 않습니다.

이 시점에서 버그를 찾지 못하더라도 여전히 작동하지 않으면 FormatMessageHandler() 인스턴스를 만들고 정적 멤버 변수로 저장하여 (잘못된 것을 테스트하기 위해). TestFuncDebug 호출에 저장된 Debug() 및 AssertWasCalled() 호출에 전달하십시오. 그게 효과가 없다면 나는 아이디어가 없다.

BTW, 나는 IgnoreArguments()가 무엇인지 모르지만, RhinoMocks에서 AssertWasCalled를 호출 할 때 호출 할 필요가 없습니다. 보통 Arg> .Is.Anything을 사용하면 문제가 없습니다.