Question

Je reçois cette erreur lorsque je tente de définir une maquette d'avoir PropertyBehavior():

  

System.InvalidOperationException: System.InvalidOperationException:       Appel non valide, le dernier appel a été utilisé ou aucun appel n'a été fait (assurez-vous que vous appelez une méthode virtuelle (C #) / Overridable (VB)) ..

Je suis en train d'utiliser seulement Rhino Mocks 3.5 (Arranger, Loi , Assert)

Voici mon 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);
    }

Je sais que je pourrais utiliser un talon (et pour le code ci-dessus je devrais) mais je suis en train d'apprendre Rhino Mocks.

Finalement, je veux être en mesure de faire en sorte que plusieurs propriétés ont leurs valeurs accessibles. (Tous les conseils sur la façon de vérifier que form.FirstName a accédé à (à savoir le getter a été appelé) serait également appréciée.)

Dans le cas où il est nécessaire, voici le 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; }
    }
}

Quoi qu'il en soit, je pensais que virtuel ne serait pas un problème car je passe dans une interface, mais je suis clairement manque quelque chose.

Était-ce utile?

La solution

Jamais utilisé PropertyBehavior avant, mais est-ce la syntaxe que vous cherchez?

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

Rhino Mocks fonctionne complètement à travers des méthodes d'extension maintenant. Le seul appel statique que je fais tous les plus est à MockRepository.GenerateStub.

Autres conseils

Vous avez mentionné l'aide d'un talon au lieu d'une maquette, mais avant d'aller changer que je note que bizarrement, je reçois l'exception d'appel non valide quand je GenerateStub mais pas quand je l'utilise GenerateMock.

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

lève l'exception d'appel non valide et oui, IAddressView.Message a un getter et setter.

I reçu ce message d'erreur lorsque j'essayé de définir une attente sur une méthode non virtuelle.

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

L'erreur a disparu quand j'ai fait NonVirtualMethod virtuelle.

Je pense que vous avez à faire MockRepository.ReplyAll () après avoir mis en place toutes les attentes et avant de commencer à utiliser cette maquette. Donc, je pense dans votre cas est que vous devez déplacer la ligne de Expect.Call avant médiateur = new AddAddressMediator (forme) ;, et coller la réponse tout juste après:

[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);



}

Je suis tombé sur cette question quand je tentais d'appeler une propriété internal (getter uniquement) sur un objet en C #. Dans ce cas, l'ajout .PropertyBehavior() n'a pas aidé.

Ma solution était d'extraire la logique de la propriété et dans une méthode interne qui je ensuite injecté dépendances dans cette méthode (en tant que paramètres).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top