1

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

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

public interface IEnumarableString : IEnumarable
{ }

public class AdvancedString : IEnumarableString
{
    private string[] _strings;
    private class StringEnumerator : IEnumerator
    {
            private IEnumerator GetEnumerator()
            {
                return (IEnumerator)this;
            }

            public object Current {get; set;}

            public bool MoveNext()
            {
                _position++;
                return _position < strings.Length;
            }

            public void Reset()
            {
                _position = -1;
            }
    }
    public IEnumerator GetEnumerator()
    {
           return new StringEnumerator(_strings);
    }
}

我想在我的测试中使用 FakeItEasy 并“伪造”它的迭代行为,我尝试了以下代码,但它不会在需要时自行迭代(就像没有元素一样跳过 foreach):

IEnumarableString stringFake = A.Fake<IEnumarableString>();

A.CallTo(() => stringFake.GetEnumerator().MoveNext()).Returns(false).Once();
A.CallTo(() => stringFake.GetEnumerator().MoveNext()).Returns(true).Once();

例如,试图搜索网络,但找不到任何东西。现在我的问题是如何配置stringFake.GetEnumerator()返回正确的对象,以便迭代可以工作,还是我在这里做错了什么?

任何帮助,将不胜感激。

谢谢

4

2 回答 2

2

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

我认为您遇到的问题是因为未配置GetEnumerator()的 onstringFake将始终返回一个新的枚举器(FakeItEasy 将具有未配置的属性始终返回相同的值,但未配置的方法不会缓存它们的返回值,并且会轻松提供新值)。

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

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);

或者其他的东西。请注意,您还必须在fakeEnumerator.Current. 已经有一个关于伪造枚举数的问题。您应该能够看到它以获取更多详细信息—<a href="https://stackoverflow.com/questions/5170842/faking-an-enumerator-in-fakeiteasy">在 FakeItEasy 中伪造一个枚举器

于 2013-12-26T19:42:24.593 回答
0

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

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

于 2013-12-29T16:11:14.280 回答