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

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

Вопрос

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

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

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» метод получения свойства Fornames используется несколько раз.Именно тогда я получаю «Rhino.Mocks.Exceptions.ExpectationViolationException:INewContactAttributes.get_Fornames();Ожидаемое №1, фактическое №2.»

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

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

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

«Ожидание было удалено из списка ожиданий. Вы вызвали Repeat.Any() ?Это не поддерживается в AssertWasCalled()».

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

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

Решение

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

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

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

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

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

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

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

где n — целое число.

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

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

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

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

newContact.Expect( c => c.ForeNames ).Return( ...).Повторить.Любой()

От Здесь:

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

или

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

или

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top