Frage

Ich erhalte diese Störung, wenn ich versuche, ein Mock zu setzen PropertyBehavior() haben:

  

System.InvalidOperationException: System.InvalidOperationException:       Unzulässiger Aufruf hat der letzte Anruf verwendet wurde oder kein Anruf getätigt wurde (stellen Sie sicher, dass Sie eine virtuelle (C # aufrufen) / Overridable (VB) Methode) ..

Ich versuche nur zu benutzen Rhino Mocks 3.5 (Vereinbaren, Act , Assert)

Hier ist mein Code:

    private IAddAddressForm form;

    private AddAddressMediator mediator;

    [TestInitialize()]
    public void MyTestInitialize()
    {
        form = MockRepository.GenerateMock<IAddAddressForm>();
        mediator = new AddAddressMediator(form);


        // Make the properties work like a normal property
        Expect.Call(form.OKButtonEnabled).PropertyBehavior();

        //I tried this too.  I still get the exception
        //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
    }


    [TestMethod]
    public void TestOKButtonEnabled()
    {

        form.OKButtonEnabled = true;
        Assert.IsTrue(form.OKButtonEnabled);
    }

Ich weiß, ich könnte einen Stub verwenden (und für den Code oben, ich soll), aber ich versuche, Rhino Mocks zu lernen.

Schließlich möchte ich in der Lage sein, um sicherzustellen, dass mehrere Eigenschaften ihre Werte zugegriffen hat. (Für Hinweise, wie diese form.FirstName überprüfen zugegriffen wurde (das heißt der Getter genannt wurde) würde auch geschätzt werden.)

Falls es nötig ist, hier ist der Code IAddressForm:

namespace AddressBook
{
    public interface IAddAddressForm
    {
        string FirstName { get; set; }
        string LastName { get; set; }
        string Address1 { get; set; }
        string State { get; set; }
        string Address2 { get; set; }
        string ZipCode { get; set; }
        string City { get; set; }
        bool OKButtonEnabled { get; set; }
    }
}

Wie auch immer, dachte ich, dass virtuelle wäre kein Problem sein, da ich in einer Schnittstelle bin vorbei, aber ich bin eindeutig etwas fehlt.

War es hilfreich?

Lösung

verwendet Nie PropertyBehavior vor, aber das ist die Syntax für die Sie suchen?

form.Stub(x=>x.OKButtonEnabled).PropertyBehavior()

Rhino Mocks arbeitet vollständig durch Erweiterungsmethoden jetzt. Der einzige statischen Aufruf ich jeden machen mehr MockRepository.GenerateStub ist.

Andere Tipps

Sie haben erwähnt, einen Stub anstelle eines Mock verwenden, aber bevor Sie es gehen zu ändern ich, dass seltsam beachten würde, erhalte ich die ungültige Anruf Ausnahme, wenn ich GenerateStub verwendet, aber nicht, wenn ich GenerateMock.

View = MockRepository.GenerateStub<IAddressView>();
View.Stub(v => v.Message).PropertyBehavior();

Dies führt die Unzulässiger Aufruf Ausnahme und ja, IAddressView.Message hat einen Getter und Setter.

ich diesen Fehler empfangen, als ich versuchte, eine Erwartung auf eine nicht-virtuelle Methode zu setzen.

mockedObject.Expect(a => a.NonVirtualMethod()).Returns(null);

Der Fehler ging weg, als ich NonVirtualMethod virtuelle gemacht.

Ich glaube, Sie MockRepository.ReplyAll zu tun haben (), nachdem Sie alle Erwartungen eingerichtet und bevor Sie diese Mock beginnen. Also meine Vermutung in Ihrem Fall, dass Sie die Expect.Call Linie bewegen müssen, bevor Mediator = new AddAddressMediator (Form) ;, und kleben Sie die Antwort alle gleich danach:

[TestInitialize()]
public void MyTestInitialize()
{
    form = MockRepository.GenerateMock<IAddAddressForm>();
    // Make the properties work like a normal property
    Expect.Call(form.OKButtonEnabled).PropertyBehavior();

    //I tried this too.  I still get the exception
    //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();

    MockRepository.ReplyAll();
    mediator = new AddAddressMediator(form);



}

Ich lief in dieser Frage, wenn ich eine internal Eigenschaft zu nennen versuchte (Getter nur) auf ein Objekt in C #. In diesem Fall hat das Hinzufügen .PropertyBehavior() nicht helfen.

war meine Lösung die Logik aus dem Vermögen und in eine interne Methode zu extrahieren, die dann I Abhängigkeiten in diesem Verfahren injiziert (als Parameter).

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