Недопустимый вызов, был использован последний вызов или вызов не был сделан
-
18-09-2019 - |
Вопрос
Я получаю эту ошибку, когда пытаюсь установить макет, чтобы иметь 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()
не помогло.
Мое решение состояло в том, чтобы извлечь логику из свойства во внутренний метод, который я затем ввел в зависимости в этот метод (в качестве параметров).