Rhino Mocks AssertWasCalled (несколько раз) на получатель свойства с использованием AAA - PullRequest
50 голосов
/ 08 апреля 2009

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

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

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

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

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

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

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

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

Ответы [ 6 ]

74 голосов
/ 20 июня 2009

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

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

26 голосов
/ 16 июля 2010

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

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

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

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

где n является целым числом.

2 голосов
/ 08 сентября 2009

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

// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();
2 голосов
/ 08 апреля 2009

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

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

0 голосов
/ 11 октября 2011

С Здесь :

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

или

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

или

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);
0 голосов
/ 08 апреля 2009

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

...