Domanda

Ho problemi con Rhino Mocks di affermare che un metodo è stato chiamato (e idealmente con un particolare parametro). Il metodo è ILog.Debug (FormatMessageHandler) in comune. Registrazione 2.0 utilizzando la nuova sintassi lamba. Funziona bene con il vecchio modo ILog.Debug pianura (stringa).

    // 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"))));
    }
È stato utile?

Soluzione 3

ho capito. Mi mancava la parte d'azione per il delegato. La sintassi corretta è:

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

anziché

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

Come o.IgnoreArguments menzionati () è superfluo e non necessario.

Altri suggerimenti

ho intenzione di assumere qui che si sono appena armeggiare con RhinoMocks, e questo non ha nulla a che fare con il quadro di registrazione, è corretto? Dico questo perché non ci sono implementazioni concrete in alcuni test, prende in giro solo.

Senza prova il codice, questa linea sembra che sarà sempre zero:

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

perché il metodo effettivo TestFunc () passa stringhe da Log.DEBUG, e non un FormatMessageHandler:

Quindi avrebbe senso che il numero di chiamate è pari a zero. Aggiungere una linea a TestFunc () in questo modo:

log.Debug(new FormatMessageHandler());

e vedere se questo risolve esso.

In primo luogo, creare una classe concreta per vedere se il metodo giusto di debug () viene chiamato in TestFuncLambda. Questo fa in modo che non sta facendo una sorta di strana conversione del lambda a stringa.

Una volta verificato che si dovrebbe essere chiamando la versione corretta, avete isolato il problema con RhinoMocks. Potrebbe essere un bug con schernisce rinoceronte. Quindi, consente di ridurre il fallimento impostare ma avvolgendo il lambda in una nuova FormatMessageHandler () prima di passare in Debug. Questo assicura che la funzione giusta deriso è chiamata e non tradotto come qualcosa d'altro.

Se non hai trovato un bug, a questo punto, e ancora non funziona, provare a creare un'istanza di FormatMessageHandler () e salvarlo come una variabile membro static (solo per testare ciò che è sbagliato). In quel salvati sul nella chiamata TestFuncDebug di debug () e la chiamata AssertWasCalled (). Se questo non funziona, io sono a corto di idee.

A proposito, io non so cosa IgnoreArguments () è, ma non ho mai dovuto chiamare nel mio RhinoMocks chiama a AssertWasCalled. Di solito avere Arg <>. Is.Anything funziona bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top