Недопустимый вызов, был использован последний вызов или вызов не был сделан

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

Вопрос

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

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

Я пытаюсь использовать только Носорог Издевается над 3.5 (Устраивать, Действовать, Утверждать)

Вот мой код:

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Я думаю, вам нужно сделать MockRepository.ReplyAll() после того, как вы настроите все ожидания и перед тем, как начнете использовать этот макет.Итак, я предполагаю, что в вашем случае вам нужно переместить Expect.Вызовите строку перед 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);



}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top