犀牛嘲弄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);