gpt4 book ai didi

c# - 模拟 IEnumerable 类型的 GetEnumerator() 方法

转载 作者:可可西里 更新时间:2023-11-01 08:22:20 25 4
gpt4 key购买 nike

以下测试用例在 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 stubbing 的原因确实有效。通常,当您枚举 IEnumerable 时,您从一个新的 IEnumerator 开始。在上面的例子中,它看起来就像我第二次可以重复使用同一个枚举器一样调用 sum,如果枚举器已经在它的末尾序列,这可以解释为什么第二次调用 Sum() 返回 0。如果是这种情况,我怎么能在这样的情况下模拟 GetEnumerator()它以我想要的方式表现的方式(例如新的枚举数或相同的枚举数重置为位置 0)?

您将如何修改上述测试用例以使第二个 .Sum() 调用实际返回 6 而不是 0?

最佳答案

WhenCalled() API 可让您动态解析返回值。

将测试用例更改为以下将允许它通过:

numbers.Stub(x => x.GetEnumerator())
.Return(null)
.WhenCalled(x => x.ReturnValue =
new List<int> { 1, 2, 3 }.GetEnumerator()
);

因此, stub 行为将始终返回一个新的枚举器,而不是返回相同的枚举器。

关于c# - 模拟 IEnumerable<T> 类型的 GetEnumerator() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/391411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com