以下测试用例在Rhino Mocks中失败:
[TestFixture]
public class EnumeratorTest
{
[Test]
public void Should_be_able_to_use_enumerator_more_than_once()
{
var numbers = MockRepository.GenerateStub<INumbers>();
numbers.Stub(x => x.GetEnumerator()).Return(new List<int>
{ 1, 2, 3 }.GetEnumerator());
var sut = new ObjectThatUsesEnumerator();
var correctResult = sut.DoSomethingOverEnumerator2Times
(numbers);
Assert.IsTrue(correctResult);
}
}
public class ObjectThatUsesEnumerator
{
public bool DoSomethingOverEnumerator2Times(INumbers numbers)
{
int sum1 = numbers.Sum(); // returns 6
int sum2 = numbers.Sum(); // returns 0 =[
return sum1 + sum2 == sum1 * 2;
}
}
public interface INumbers : IEnumerable<int> { }
我认为这个测试用例有一些非常微妙的地方,我认为这是因为我没有考虑清楚Rhino Mocks存根实际上是如何工作的。通常,当您枚举IEnumerable时,您会从新的IEnumerator开始。在上面的示例中,看起来我可能正在重复使用同一个枚举器进行第二次调用sum,如果枚举器已经到达其序列的末尾,那么这可以解释为什么第二次对Sum()的调用返回0。如果情况确实如此,我应该如何模拟GetEnumerator(),使其以我想要的方式行事(例如,新枚举器或将同一个枚举器重置为位置0)?
您如何修改上述测试用例,以使第二个.Sum()调用实际返回6而不是0?