以下测试用例在 rhino 模拟中失败:
[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?