Pregunta

Estoy teniendo problemas para usar Rhino se burla de afirmar que un método se llama (e idealmente con un parámetro en particular). El método es ILog.Debug (FormatMessageHandler) en Común. Inicio de sesión 2.0 utilizando la nueva sintaxis lamba. Funciona bien usando la vieja manera ILog.Debug normal (cadena).

    // 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"))));
    }
¿Fue útil?

Solución 3

lo he descubierto. Me faltaba la parte de acción para el delegado. La sintaxis correcta es:

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

en lugar de

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

Como o.IgnoreArguments mencionados () era redundante y no es necesario.

Otros consejos

Voy a suponer aquí que usted está toqueteando las RhinoMocks, y esto no tiene nada que ver con el marco de registro, ¿es correcto? Digo esto porque no existen implementaciones concretas en sus pruebas, sólo se burla.

Sin probar su código, esta línea parece que siempre será cero:

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

debido a que su método actual TestFunc () pasa a cadenas Log.DEBUG, y no un FormatMessageHandler:

Por lo tanto, tendría sentido que el número de llamadas es cero. Añadir una línea a TestFunc () así:

log.Debug(new FormatMessageHandler());

y ver si se soluciona el problema.

En primer lugar, crear una clase concreta para ver si el método correcto de depuración () se llama en TestFuncLambda. Esto asegura que no está haciendo algún tipo de conversión raro de la lambda de cadena.

Una vez que verifique que se debe llamar a la versión correcta, que ha aislado el problema con RhinoMocks. Podría ser un error con los simulacros de rinocerontes. Por lo tanto, vamos a reducir el fracaso set, pero envolviendo la lambda en una nueva FormatMessageHandler () antes de pasarlo en depuración. Esto asegura que la función correcta burlado se está llamando y no traduce como algo más.

Si no ha encontrado un error en este punto, y todavía no funciona, intente crear una instancia de FormatMessageHandler () y guardarlo como una variable miembro estática (sólo para probar lo que está mal). En aquel guardado en la llamada en TestFuncDebug de depuración () y la llamada AssertWasCalled (). Si eso no funciona, estoy fuera de ideas.

Por cierto, no sé qué IgnoreArguments () es, pero nunca tengo que llamarlo en mi RhinoMocks llama a AssertWasCalled. Por lo general, tener Arg <>. Is.Anything funciona bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top