Teilweise Spott der Klasse mit Moq

Ich will, zu verhöhnen, nur die GetValue - Methode der folgenden Klasse, mit Moq:

public class MyClass
{
    public virtual void MyMethod()
    {
        int value = GetValue();
        Console.WriteLine("ORIGINAL MyMethod: " + value);
    }

    internal virtual int GetValue()
    {
        Console.WriteLine("ORIGINAL GetValue");
        return 10;
    }
}

Ich schon ein wenig gelesen, wie das funktionieren sollte mit Moq. Die Lösung, die ich online gefunden, ist die Verwendung der CallBase Eigenschaft, aber das funktioniert nicht für mich.

Dies ist mein test:

[Test]
public void TestMyClass()
{
     var my = new Mock<MyClass> { CallBase = true };
     my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999);
     my.Object.MyMethod();
     my.VerifyAll();
 }

Ich würde erwarten, dass Moq nutzt die vorhandene Implementierung von MyMethod und fordert die verspottet-Methode, was in der folgenden Ausgabe:

ORIGINAL MyMethod: 999
MOCKED GetValue

aber das ist, was ich bekomme :

ORIGINAL GetValue
ORIGINAL MyMethod: 10

dann

Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue()

Bekam ich das Gefühl, dass ich etwas völlig missverstanden. Was vermisse ich hier?
Jede Hilfe würde geschätzt

möglich, Duplikat der Wenn die Verspottung einer Klasse mit Moq, wie kann ich CallBase nur für spezielle Methoden?
Wenn Sie Ihre GetValue Methode public statt internal es funktioniert. Ich weiß nicht warum, vielleicht ist dies eine Einschränkung von castle dynamic proxy, oder ist es ein bug, ein Moq, oder dies ist das beabsichtigte Verhalten. Jedenfalls, wenn Sie verlassen es als interne können Sie nicht setzen Sie Ihre Produktions-code in einer anderen assembly, es sei denn, Sie verwenden InternalVisibleTo.
mögliche Duplikate von Überprüfen, wurde eine Methode mit Namen
naja, es funktioniert wirklich, wenn ich eine änderung GetValuezu public. Das ist eine echte Enttäuschung. Ich habe eine sehr komplexe Klasse verwendet, die eine private Methode zu schreiben, dessen Ergebnis in eine ascii-Datei. Ich wollte nur loswerden, dass die Datei, und überprüfen Sie die Zeichenfolge direkt in meine unit-test. Wie soll ich dies tun?

InformationsquelleAutor Fabian | 2012-06-13

Schreibe einen Kommentar