C# 如何使用FakeiTesy伪造可枚举类

C# 如何使用FakeiTesy伪造可枚举类,c#,unit-testing,ienumerable,fakeiteasy,C#,Unit Testing,Ienumerable,Fakeiteasy,我正在学习为我的代码使用/执行/编写测试,并开始为我的伪/模拟对象使用FakeiTasy,现在我遇到了一个问题: 我有以下实现IEnumerable的类和实现IEnumerator的内部类(下面没有完整的代码): 公共接口IEnumarableString:IEnumarable { } 公共类高级字符串:IEnumarableString { 私有字符串[]_字符串; 私有类StringEnumerator:IEnumerator { 私有IEnumerator GetEnumerator()

我正在学习为我的代码使用/执行/编写测试,并开始为我的伪/模拟对象使用FakeiTasy,现在我遇到了一个问题:

我有以下实现
IEnumerable
的类和实现
IEnumerator
的内部类(下面没有完整的代码):

公共接口IEnumarableString:IEnumarable
{ }
公共类高级字符串:IEnumarableString
{
私有字符串[]_字符串;
私有类StringEnumerator:IEnumerator
{
私有IEnumerator GetEnumerator()
{
返回(IEnumerator)这个;
}
公共对象当前{get;set;}
公共图书馆
{
_位置++;
返回位置
我想在我的测试中使用FakeiTasy并“伪造”它的迭代行为,我尝试了以下代码,但在需要时它不会迭代(只需跳过foreach,就像没有元素一样):

IEnumarableString stringFake=A.Fake();
A.CallTo(()=>stringFake.GetEnumerator().MoveNext()).Returns(false).Once();
A.CallTo(()=>stringFake.GetEnumerator().MoveNext()).Returns(true).Once();
例如,尝试搜索网络,但找不到。 现在我的问题是如何配置
stringFake.GetEnumerator()
以返回正确的对象,从而使迭代能够工作,还是我在这里做错了什么

任何帮助都将不胜感激


谢谢

如果你不能像@TimS建议的那样提供一个具体的
IEnumerable
,因为你需要额外的功能,我想我有一个解决方案给你

我认为您遇到的问题是因为
stringFake
上未配置的
GetEnumerator()
总是会返回一个新的枚举数(FakeiTesy将有未配置的属性总是返回相同的值,但未配置的方法不会缓存其返回值,并且会很容易地提供新值)

如果您将其配置为返回特定的枚举数,您的运气会更好。我身上没有编译器,但类似于:

IEnumarableString stringFake = A.Fake<IEnumarableString>();
IEnumerator<string> fakeEnumerator = A.Fake<IEnumerator<string>>();

A.CallTo(() => stringFake.GetEnumerator()).Returns(fakeEnumerator);
A.CallTo(() => fakeEnumerator.MoveNext()).ReturnsNextFromSequence(true, false);
IEnumarableString stringFake=A.Fake();
IEnumerator fakeEnumerator=A.Fake();
A.CallTo(()=>stringFake.GetEnumerator()).Returns(fakeEnumerator);
A.CallTo(()=>fakeEnumerator.MoveNext()).ReturnsNextFromSequence(true,false);

或者别的什么。请注意,您还必须在
fakeEnumerator.Current
上设置行为。现在已经有了一个关于伪造人口普查员的问题。您应该可以查看它以了解更多详细信息-

伪造自己的对象似乎很不自然,我通常只伪造我无法控制的依赖项。在这种情况下,我会使用一个构造函数,让我传入一个现成的字符串数组。或者,我将使用我想要的测试行为来实现IEnumerablesting的不同实现


如果AdvancedString是被测试的单元,那么只需给它一些测试数据即可,不要试图伪造可枚举性,因为这是您测试的一部分。

为什么不使用
IEnumerable
Current
始终为空?@TimS-因为我需要IEnumerable不提供的一些额外功能,这不是整个课程,只是相关的parts@SriramSakthivel-我不确定我是否理解您的问题,但是(在测试中)当代码到达foreach语句时,它会进入,但会像跳过字符串为空一样跳过。您实际要测试什么?如果您想测试您的可枚举类本身,为什么要模拟任何东西?如果您想为其他对象提供模拟枚举,为什么不提供一个列表,如果所有枚举逻辑都已就绪,那么它应该是这样的,并查看使用者是如何工作的?谢谢,它看起来很有希望,但只有当fakeEnumerator.MoveNext()配置为先返回true,然后返回false时,我才能使其工作,配置当前似乎是一个挑战,如果可行,我会将其标记为答案。只需使用预期的实际值将
当前
设置为
ReturnsNextFromSequence
IEnumarableString stringFake = A.Fake<IEnumarableString>();

A.CallTo(() => stringFake.GetEnumerator().MoveNext()).Returns(false).Once();
A.CallTo(() => stringFake.GetEnumerator().MoveNext()).Returns(true).Once();
IEnumarableString stringFake = A.Fake<IEnumarableString>();
IEnumerator<string> fakeEnumerator = A.Fake<IEnumerator<string>>();

A.CallTo(() => stringFake.GetEnumerator()).Returns(fakeEnumerator);
A.CallTo(() => fakeEnumerator.MoveNext()).ReturnsNextFromSequence(true, false);