繁体   English   中英

使用AAA的Rhino Mocks AssertWasCalled(多次)在属性getter上

[英]Rhino Mocks AssertWasCalled (multiple times) on property getter using AAA

我有一个模拟对象作为构造函数参数传递给另一个对象。

如何测试已调用模拟对象的属性? 这是我目前使用的代码:

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属性的getter被多次使用。 那时我得到“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一起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是int。

根据您使用的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM