문제

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. 모든 것이 잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top