Подтвердить что ты не робот

Rhino Mocks AssertWasCalled (несколько раз) на свойство getter с использованием AAA

У меня есть mocked объект, который передается как аргумент конструктора другому объекту.

Как я могу проверить, что было вызвано свойство mocked object? Это код, который я использую в настоящее время:

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });

Это работает, за исключением случаев, когда в "someobject" свойство getter on Forenames используется несколько раз. Это когда я получаю "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames(); Ожидаемое # 1, Actual # 2.."

Просто используя

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());

не работает и дает ошибку ниже:

"Ожидание было удалено из списка ожидающих ожиданий, вы вызвали Repeat.Any()? Это не поддерживается в AssertWasCalled()."

Итак, как мне обслуживать несколько вызовов?

4b9b3361

Ответ 1

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Repeat.Any не работает с AssertWasCalled, потому что 0 считается как любой... поэтому, если он НЕ был вызван, AsserWasCalled вернет TRUE, даже если он не был вызван.

Ответ 2

Я согласен с ответом на крис

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Дополнительно Если вы точно знаете, сколько раз будет вызываться свойство, вы можете сделать

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));

где n - int.

Ответ 3

Какова ваша мотивация при проверке количества раз, когда она называется? Это особенно дорогостоящая операция? Если это так, то я бы предложил, чтобы вы поместили его вместо метода, поскольку, по-семантически, свойства должны быть недорогими.

Кроме того, проверка количества раз, когда вы вызываете свойство, не является тягой модульного тестирования (не беспокойтесь, что слишком часто приходится проверять слишком много, мы все были там). То, что вы действительно должны тестировать, заключается в том, что при условии состояния вашего макетного объекта, что метод генерирует ожидаемый результат. Количество вызовов, вызываемых этим методом, на самом деле не имеет значения (если это не служба для отправки электронной почты или чего-то еще). Это деталь реализации, которую вы обычно не тестировали, поскольку простой рефактор нарушил бы ваши тесты, поскольку они были бы слишком конкретными.

Ответ 4

В зависимости от вашей версии Rhino, которую вы используете, вы можете использовать:

// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();

Ответ 5

newContact.Expect(c = > c.ForeNames).Return(...).Repeat.Any()

Ответ 6

Из Здесь:

mock.AssertWasCalled(x => x.Name ="Bob");

или

mock.AssertWasCalled(x => x.Name =Arg.Is("Bob"));

или

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);