我们在rhinomock上有一个NextInterestDate属性,我们最初设置为31/03/2000。访问此属性,此日期用于处理3月的利息计算。 3月处理完成后,需要将房产更新为下一个按时间顺序排列的日期,即30/04/2000。
下一次循环时,我们希望mock在mock上访问NextInterestDate时返回4月结束日期。简而言之,每次循环时都会重新计算新日期,并且模拟的属性将重新分配给新日期。
这意味着每次循环时都必须更新模拟上的日期。
然而,我们看到的是日期仍然是2000年3月31日,而不是正确更新。
我们对RhinoMocks相对较新,但我们更喜欢它与NMocks,尽管似乎有一个陡峭的学习曲线。
为了解决这个问题,以前的开发人员使用了NMock并使用了一个clonable类,她使用了NMocks ... Return.CloneOF,它允许模拟能够更新模拟并提供新值。
我们似乎无法弄清楚正确的语法/或实现此目的的方法。
非常感谢关注科林
答案 0 :(得分:1)
您可以使用.WhenCalled
方法实现此目的。这可能看起来很狡猾,但完全符合您的要求:
var expectedDates = new[]
{
new DateTime(2000, 3, 31),
new DateTime(2000, 4, 30),
new DateTime(2000, 5, 31),
};
var invocationsCount = 0;
service.Expect(s => s.NextInterestDate)
.WhenCalled(m => m.ReturnValue = expectedDates[invocationNumber++])
.Return(default(DateTime));
上面的代码只是从每个连续调用的expectedDates
数组中获取下一个元素。最后对Return(default(DateTime))
的奇怪调用必须在那里(否则Rhino会抱怨)。当我们已经使用WhenCalled
指定一个时,你不应该担心假的返回值被忽略。
请注意,您需要注意上面的代码(递增计数器,数组 - 所有这些都在模拟设置中)。可读性并不是最好的,因此使用适当的变量/测试方法命名至关重要。