Frage

Ich habe Probleme mit Rhino Mocks zu behaupten, dass eine Methode aufgerufen wurde (und im Idealfall mit einem bestimmten Parameter). Das Verfahren ist ILog.Debug (FormatMessageHandler) in Common. Logging 2.0 die neue lamba Syntax. Es funktioniert gut, die alte Art und Weise schlicht ILog.Debug (string) verwendet wird.

    // 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"))));
    }
War es hilfreich?

Lösung 3

dachte ich es aus. Ich war die Aktion Teil für die Delegierten fehlt. Die richtige Syntax lautet:

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

statt

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

Wie bereits erwähnt o.IgnoreArguments () ist überflüssig, und nicht erforderlich.

Andere Tipps

Ich werde hier davon ausgehen, dass Sie nur mit RhinoMocks basteln, und das hat nichts mit dem Logging-Framework zu tun, ist das richtig? Ich sage das, weil es keine konkreten Implementierungen in Ihren Tests sind nur Attrappen.

Ohne Code zu testen, diese Zeile sieht aus wie es wird immer Null:

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

, weil Ihre aktuelle Methode TestFunc () übergibt Strings log.debug und keinen FormatMessageHandler:

So ist es sinnvoll wäre, dass die Zahl der Anrufe Null ist. Fügen Sie eine Zeile zu TestFunc () wie folgt aus:

log.Debug(new FormatMessageHandler());

und sehen, ob das behebt es.

Erstellen Sie zunächst eine konkrete Klasse, um zu sehen, ob der richtige Debug () -Methode in TestFuncLambda aufgerufen wird. Dies stellt sicher, dass es nicht irgendeine Art von seltsamer Umwandlung der Lambda-String zu tun.

Wenn Sie überprüfen, ob die richtige Version anrufen wird, soll, haben Sie das Problem mit RhinoMocks isoliert. Es könnte ein Fehler mit Rhino Mocks sein. So läßt das Versagen Satz reduzieren, aber das Lambda in einem neuen FormatMessageHandler () packen, bevor Sie es in Debug passieren. Dadurch wird sichergestellt, dass die richtige verspott Funktion aufgerufen wird und nicht als etwas anderes übersetzt.

Wenn Sie nicht einen Fehler an dieser Stelle gefunden, und es immer noch nicht funktioniert, versuchen, eine Instanz von FormatMessageHandler () zu schaffen und es als eine statische Membervariable (nur zu testen, was falsch ist) zu speichern. dass Pass in dem TestFuncDebug Aufruf Debug () und die AssertWasCalled () Aufruf gespeichert auf. Wenn das nicht funktioniert, bin ich von Ideen aus.

BTW tun sie nicht, ich weiß, was IgnoreArguments () ist, aber ich habe es nie in meinem RhinoMocks Anrufe AssertWasCalled nennen. In der Regel mit Arg <>. Is.Anything funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top