Warum hat mein Teil-Mock haben alle virtuellen Methoden verspottet, auch wenn keine Erwartungen gesetzt sind?

StackOverflow https://stackoverflow.com/questions/806073

Frage

Ich habe eine Benutzersteuerung, die eine gewisse Validierung in der ValidateChildren Methode macht die Ich mag würde testen. Ich habe eine partielle Mock der Benutzersteuerung erstellt, aber obwohl ich keine Erwartungen an die ValidateChildren Methode Einstellung, ich rufe sie einfach, es ist einfach übersprungen und der Code innerhalb der Methode führt nie. Um zu versuchen, zu verstehen, was los ist auf mir einen einfachen Test erstellt, etwa so:

public class Foo
{        
    public virtual bool Method1()
    {
        throw new NotImplementedException();
    }

    public virtual bool Method2()
    {
        return Method1();
    }
}

und verwenden Sie diese zu testen:

[Test]
public void TestFooMethods ()
{
    MockRepository m = new MockRepository();
    Foo foo = m.PartialMock<Foo>();

    RhinoMocksExtensions.Expect<Foo,bool>(
                             foo, 
                             delegate (Foo obj)
                             {
                                 return obj.Method1();
                             }
                         ).Return(true);

    Assert.IsTrue (foo.Method2());
}

Jetzt würde ich erwarten, foo.Method1 verspottet werden und foo.Method2 nicht zu sein. Aber das gibt immer falsch, und wenn ich versuche, und Schritt für Schritt durch im Debugger foo.Method2 () über abgestuft, und ich kann nicht auf sie einspringen.

Irgendwelche Ideen, warum?

War es hilfreich?

Lösung 2

Ok, nach etwas mehr herumspielen (vielleicht das Schreiben nur das Problem nach unten hat mir geholfen, klarer denken darüber) Ich denke, dass ich die Lösung gefunden zu haben.

es scheint, dass ich anrufen müssen:

RhinoMocksExtensions.Replay (foo);

, bevor ich rufe

Assert.IsTrue (foo.Method2 ());

Vielleicht Rhino spottet Bedürfnisse werden ausdrücklich gesagt, wenn virtuelle Methoden benutzt werden und die Erwartungen nicht einrichten. Nicht sicher warum. Wenn jemand die Überlegung dahinter weiß, ich würde gerne wissen.

Auf jeden Fall scheint alles zu funktionieren, so glückliche Tage.

Andere Tipps

Wenn Sie verspotten ein Objekt es all abstrakte / virtuelle Methoden außer Kraft setzen, unabhängig von der Art des Mock. Was Sie jedoch tun, ist eine Erwartung auf Ihre Methode machen und sagen, dass es die ursprüngliche Methode auszuführen es wird überschrieben durch die Verwendung:

CallOriginalMethod(OriginalCallOptions.CreateExpectation);

Sie sind nicht mit Rhino Mocks, wie es war Design, das auch Sie Probleme verursachen könnte. Ich habe den Test in der Art und Weise neu geschrieben geschrieben werden soll, C # 3.0 und Lambda und Erweiterung Methoden:

[TestMethod]
public void TestFooMethods()
{
    //Generate a new Mock to test against
    Foo foo = MockRepository.GenerateMock<Foo>();

    //Expect a call to Method1 on object foo and return true
    foo.Expect(f => f.Method1()).Return(true);
    //Expect a call to Method2 on object foo and call the original method
    foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation);

    Assert.IsTrue(foo.Method2());

    //Verify all our expectations on foo
    foo.VerifyAllExpectations();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top