犀牛制品AssertWasCalled(多次)使用AAA属性的getter
-
05-09-2019 - |
题
我有一个是作为构造器参数到另一物体通过的嘲笑对象。
我如何测试一个嘲笑对象的属性已叫什么名字?这是我使用目前代码:
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());
此外如果你确切地知道多少次的财产将被称为可以做
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));
其中n是一个整数。
什么是背后的检查它被称为次数的动机是什么?它是一个特别昂贵的操作?如果是这样,那么我会建议你把它的方法,而不是落后的,语义上来说,性能应该是廉价的电话。
此外,检查的时间的属性称为数量不是单元测试的推力(不要担心这是一个常见的错误,以测试太多了,我们都在那里)。你应该真正测试的是给你的模拟对象的状态,该方法产生预期的输出。次调用方法时要做到这一点并不重要(除非它是发送电子邮件或某事服务)的数量。这是一个实现细节,你通常不会测试为简单的重构将打破你的测试,因为它们可能过于具体。
根据您的犀牛的版本,您正在使用,你可以使用:
// 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);