Неверный звонок, последний звонок был использован или звонок не был сделан - PullRequest
19 голосов
/ 19 августа 2009

Я получаю эту ошибку, когда пытаюсь установить для макета значение PropertyBehavior():

System.InvalidOperationException: System.InvalidOperationException: Неверный вызов, последний вызов был использован или не был сделан (убедитесь, что вы вызываете виртуальный (C #) / переопределяемый (VB) метод) ..

Я пытаюсь использовать только Rhino Mocks 3.5 (Arrange, Act, Assert)

Вот мой код:

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

Я знаю, что мог бы использовать заглушку (и для кода выше, я должен), но я пытаюсь выучить Rhino Mocks.

В конце концов я хочу быть в состоянии убедиться, что к нескольким свойствам имеют доступ к их значениям. (Любые советы о том, как проверить, что form.FirstName был получен доступ (т. Е. Был вызван получатель), также приветствуются.)

В случае необходимости, вот код для 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; }
    }
}

Во всяком случае, я думал, что виртуальный не будет проблемой, так как я передаю интерфейс, но я явно что-то упускаю.

Ответы [ 5 ]

10 голосов
/ 20 августа 2009

Никогда раньше не использовал PropertyBehavior, но это тот синтаксис, который вы ищете?

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

Rhino Mocks теперь полностью работает через методы расширения. Единственный статический звонок, который я каждый раз делаю, это MockRepository.GenerateStub.

1 голос
/ 09 июля 2014

Я получил эту ошибку, когда попытался установить ожидание для не виртуального метода.

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

Ошибка исчезла, когда я сделал виртуальный NonVirtualMethod.

1 голос
/ 13 октября 2009

Вы упомянули об использовании заглушки вместо макета, но перед тем, как приступить к ее изменению, замечу, что странным образом я получаю исключение Invalid Call, когда использую GenerateStub, а не когда использую GenerateMock.

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

Это вызывает исключение Invalid call, и да, IAddressView.Message действительно имеет геттер и сеттер.

0 голосов
/ 21 июня 2012

Я столкнулся с этой проблемой, когда пытался вызвать свойство internal (только для getter) для объекта в C #. В этом случае добавление .PropertyBehavior() не помогло.

Мое решение состояло в том, чтобы извлечь логику из свойства во внутренний метод, который я затем ввел в этот метод зависимости (в качестве параметров).

0 голосов
/ 19 августа 2009

Я думаю, что вы должны выполнить MockRepository.ReplyAll () после того, как вы настроили все ожидания и перед тем, как начать использовать этот макет. Поэтому в вашем случае я предполагаю, что вам нужно переместить строку Expect.Call до mediator = new AddAddressMediator (form); и вставить ответ сразу после этого:

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



}
...