Rhino Mocks -Common.logging Ilog.debug에 Assertwascall을 사용합니다
-
20-09-2019 - |
문제
Rhino Mocks를 사용하여 메소드가 호출되었다고 주장하는 데 어려움을 겪고 있습니다 (이상적으로는 특정 매개 변수). 이 메소드는 ilog.debug (formatmessageHandler)입니다 공통 .logging 2.0 새로운 Lamba 구문 사용. 기존 way plain 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"))));
}
해결책 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를 땜질하고 있다고 가정 할 것입니다. 이것은 로깅 프레임 워크와 관련이 없습니다. 맞습니까? 테스트에는 구체적인 구현이없고 모의 만 있기 때문에 이것을 말합니다.
코드를 테스트하지 않으면이 라인은 항상 0 인 것 같습니다.
logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());
실제 메소드 testfunc ()가 문자열을 통과하여 log.debug로 전달되기 때문에 형식 messageHandler가 아닙니다.
따라서 통화 수는 0이라는 것이 합리적입니다. 다음과 같이 testfunc ()에 줄을 추가하십시오.
log.Debug(new FormatMessageHandler());
그리고 그것이 그것을 고치는 지 확인하십시오.
먼저, TestFunClambda에서 오른쪽 디버그 () 메소드가 호출되는지 확인하기 위해 구체적인 클래스를 작성하십시오. 이것은 Lambda를 끈으로 이상한 변환을 수행하지 않도록합니다.
올바른 버전을 호출 해야하는지 확인하면 Rhinomocks의 문제를 격리했습니다. 코뿔소 모의가있는 버그 일 수 있습니다. 따라서 실패 세트를 줄이지 만 Debug에 전달하기 전에 새로운 FormatmessageHandler ()로 Lambda를 감싸는 것입니다. 이렇게하면 올바른 조롱 된 기능이 호출되고 다른 것으로 번역되지 않도록합니다.
이 시점에서 버그를 찾지 못했지만 여전히 작동하지 않는 경우 FormatMessageHandler ()의 인스턴스를 작성하고 정적 멤버 변수로 저장하십시오 (잘못된 내용을 테스트하기 위해). testfuncdebug 콜에 debug () 및 assertwascalled () 호출에 저장된 통과를 통과하십시오. 그것이 효과가 없다면, 나는 아이디어가 없습니다.
BTW, 나는 무시 의지 ()가 무엇인지 모르겠지만, 나는 rhinomocks 호출에서 Assertwascall을 호출 할 필요가 없습니다. 일반적으로 arg <>. is. 모든 것이 잘 작동합니다.