我有一个是作为构造器参数到另一物体通过的嘲笑对象。

我如何测试一个嘲笑对象的属性已叫什么名字?这是我使用目前代码:

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.AnyAssertWasCalled工作,因为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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top