2009-04-08 2 views
49

У меня есть насмешливый объект, переданный в качестве аргумента конструктора другому объекту.Rhino Mocks AssertWasCalled (несколько раз) на свойство getter с использованием AAA

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

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», что геттерный на имущество отчество используется несколько раз. Вот когда я получаю "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames(); Ожидаемое # 1, # 2 Actual .."

Просто с помощью

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

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

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

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

+1

Нажмите ✓ ниже один из ответов, чтобы принять его. – lockstock

ответ

70

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

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

+3

Спасибо, это сэкономило мне время. Должен быть лучший ответ на вопрос (IMO) – Thies

2

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

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

+0

Спасибо, Гарри. На самом деле я не хочу проверять, сколько раз был вызван приемник, только потому, что он был вызван. Как это бывает, «какой-то объект» использует его дважды. В этом причина проблемы; похоже, не существует способа использовать .Repeat.Any() с AssertWasCalled. – Confused

+0

Но в целом проверка правильности вывода означает, что свойство было вызвано. Как результат может быть правильным, если свойство не было вызвано? –

+0

Garry, ваши комментарии действительны, но вы также должны сказать, что в основном есть две школы ложного тестирования: на основе состояния и взаимодействия. Утверждение того, сколько раз метод вызывается, отлично подходит для тестирования на основе взаимодействия. И иногда государство не меняется. –

0

newContact.Expect (с => c.ForeNames) Возвращенная (...) .Repeat.Any()

2

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

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

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

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.

0

От Here:

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

или

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

или

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

Этот ответ не будет работать, потому что вы будете утверждать, что метод вызывается один раз. Вопрос заключается в утверждении, что метод был вызван несколько раз. – Peter

Смежные вопросы