犀牛嘲弄AssertWasCall(多次)属性获取使用AAA

我有一个模拟对象作为构造函数parameter passing给另一个对象。

我怎样才能testing一个模拟对象的属性被调用? 这是我目前正在使用的代码:

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()中不受支持。

那么如何迎合多个电话呢?

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()); 

此外,如果您确切知道该物业将被召唤多less次,您可以做

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

其中n是一个整数。

检查被调用次数的动机是什么? 这是一个特别昂贵的操作? 如果是的话,那么我build议你把它放在一个方法之后,而不是从语义上来说,属性应该是廉价的调用。

另外,检查一个属性被调用的次数并不是unit testing的重点(不要担心testing太多是一个常见的错误,我们都在那里)。 你真正应该testing的是给定你的模拟对象的状态,该方法产生预期的输出。 调用方法的次数并不重要(除非它是一个发送电子邮件的服务)。 这是一个你通常不会testing的实现细节,因为简单的重构会破坏你的testing,因为它们太具体了。

根据您使用的Rhino版本,您可以使用:

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

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

从这里 :

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

要么

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

要么

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