Unit testing Rhinomock相当于NMock中的Return.CloneOf

Unit testing Rhinomock相当于NMock中的Return.CloneOf,unit-testing,rhino-mocks,Unit Testing,Rhino Mocks,我们在rhinomock上有一个NextInterestDate属性,最初设置为2000年3月31日。访问此属性,并将此日期用于处理3月份的利息计算。3月份处理完成后,需要将物业更新为下一个按时间顺序排列的计息日,即2000年4月30日 下一次循环时,我们希望mock在访问mock上的NextInterestDate时返回四月结束日期。简言之,每次循环中都会重新计算一个新日期,并使用新日期重新分配模拟上的属性 这意味着模拟上的日期必须在每次循环中更新 然而,我们看到的是,日期仍然是2000年3月

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

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

这意味着模拟上的日期必须在每次循环中更新

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

我们对Rhinomock比较陌生,但我们更喜欢它而不是NMock,尽管这似乎是一个陡峭的学习曲线

为了解决这个问题,以前的开发人员使用了NMock并使用了一个可克隆类,她使用了NMock…Return.CloneOF,这使得mock能够更新mock并提供新的值

我们似乎无法找到正确的语法或实现这一点的方法


事先非常感谢Colin

当调用方法时,您可以使用
实现这一点。这可能看起来很不可靠,但正是您想要的:

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(默认值(DateTime))
的奇怪调用必须在那里(否则Rhino会抱怨)。您不必担心,如果我们已经在调用时使用
指定了一个值,那么会忽略-false返回值


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

您可以通过
实现这一点。这可能看起来很不可靠,但正是您想要的:

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(默认值(DateTime))
的奇怪调用必须在那里(否则Rhino会抱怨)。您不必担心,如果我们已经在调用时使用
指定了一个值,那么会忽略-false返回值


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

好答案。然而,由于这些新的日期是计算出来的,我会将计算算法放入WhenCalled块,而不是从数组中获取静态日期(当然,如果可能)。@IvanGerken:如果日期确实来自算法,那么应该将算法存根并输入准备好的值。否则,有一天可能会有人改变算法,一堆不相关的测试突然中断。你不想在单元测试中有任何不确定性。回答得好。然而,由于这些新的日期是计算出来的,我会将计算算法放入WhenCalled块,而不是从数组中获取静态日期(当然,如果可能)。@IvanGerken:如果日期确实来自算法,那么应该将算法存根并输入准备好的值。否则,有一天可能会有人改变算法,一堆不相关的测试突然中断。您不希望在单元测试中出现任何不确定性。