RhinoMocks相当于NMock中的Return.CloneOf

时间:2012-02-17 04:58:05

标签: unit-testing rhino-mocks

我们在rhinomock上有一个NextInterestDate属性,我们最初设置为31/03/2000。访问此属性,此日期用于处理3月的利息计算。 3月处理完成后,需要将房产更新为下一个按时间顺序排列的日期,即30/04/2000。

下一次循环时,我们希望mock在mock上访问NextInterestDate时返回4月结束日期。简而言之,每次循环时都会重新计算新日期,并且模拟的属性将重新分配给新日期。

这意味着每次循环时都必须更新模拟上的日期。

然而,我们看到的是日期仍然是2000年3月31日,而不是正确更新。

我们对RhinoMocks相对较新,但我们更喜欢它与NMocks,尽管似乎有一个陡峭的学习曲线。

为了解决这个问题,以前的开发人员使用了NMock并使用了一个clonable类,她使用了NMocks ... Return.CloneOF,它允许模拟能够更新模拟并提供新值。

我们似乎无法弄清楚正确的语法/或实现此目的的方法。

非常感谢关注科林

1 个答案:

答案 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))的奇怪调用必须在那里(否则R​​hino会抱怨)。当我们已经使用WhenCalled指定一个时,你不应该担心假的返回值被忽略

请注意,您需要注意上面的代码(递增计数器,数组 - 所有这些都在模拟设置中)。可读性并不是最好的,因此使用适当的变量/测试方法命名至关重要。