【发布时间】:2008-12-24 13:36:02
【问题描述】:
以下测试用例在 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?
【问题讨论】:
标签: c# mocking rhino-mocks