Pergunta

Estou tendo problemas para usar zombars do rinoceronte para afirmar que um método foi chamado (e idealmente com um parâmetro específico). O método é ilog.debug (formatMessageHandler) em Common.ogging 2.0 usando a nova sintaxe Lamba. Funciona bem usando a maneira antiga 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"))));
    }
Foi útil?

Solução 3

Eu descobri. Eu estava perdendo a parte de ação do delegado. A sintaxe adequada é:

logger.AssertWasCalled(x => x.Debug(Arg<Action<FormatMessageHandler>>.Is.Anything));

ao invés de

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

Como mencionado, o IGRORGUMENTES () era redundante e não é necessário.

Outras dicas

Vou assumir aqui que você está apenas mexendo com Rhinomocks, e isso não tem nada a ver com a estrutura de registro, está correto? Eu digo isso porque não há implementações concretas em seus testes, apenas zombam.

Sem testar seu código, essa linha parece sempre zero:

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

Porque seu método real testfunc () passa strings para log.debug, e não um formatMessageHandler:

Portanto, faria sentido que o número de chamadas seja zero. Adicione uma linha para testfunc () como este:

log.Debug(new FormatMessageHandler());

E veja se isso o corrige.

Primeiro, crie uma classe concreta para ver se o método Right Debug () está sendo chamado no testFunclambda. Isso garante que não esteja fazendo algum tipo de conversão estranha do lambda em string.

Depois de verificar isso, deve estar chamando a versão correta, você isolou o problema com o Rhinomocks. Pode ser um bug com rinocerontes zombares. Portanto, vamos reduzir a falha definida, mas embrulhar o lambda em um novo formatMessageHandler () antes de passar para a depuração. Isso garante que a função ridicularizada certa esteja sendo chamada e não traduzida como outra coisa.

Se você não encontrou um bug neste momento e ainda não funciona, tente criar uma instância de formatMessageHandler () e salvá -lo como uma variável estática (apenas para testar o que está errado). Passe o salvo na chamada Testfuncdebug para Debug () e a chamada assertwascalled (). Se isso não funcionar, estou sem ideias.

BTW, eu não sei o que é os órgãos de ignorear (), mas nunca tenho que chamá -lo nas minhas chamadas de Rhinomocks para assertwascalled. Geralmente, ter arg <>. Is. Qualquer coisa funciona bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top