3

我有一个IEnumerable<T>集合,我想模拟First<T>()方法调用。当我尝试这样做时,我得到了这个:

上一个方法 'IEnumerator.MoveNext();' 需要返回值或抛出异常。

我正在粘贴下面的代码:

IEnumerable<T> collection = MockRepository
    .GenerateStub<IEnumerable<T>>();
collection
    .Stub(x => x.First<T>())
    .IgnoreArguments()
    .Return(MockRepository.GenerateStub<T>());

但是x.First<T>抛出了上述异常。我该如何解决?我也尝试IEnumerator通过模拟GetEnumerator()方法调用来返回一个。它也没有帮助。

4

1 回答 1

5

我将假设它T存在,因为代码位于通用函数中。

您不能存根调用,First<T>()因为它是静态扩展方法。它没有在 中定义IEnumerable<T>,它是 的成员Enumerable

因此,您需要GetEnumerator()在您的存根上IEnumerable<T>存根以返回一个IEnumerator<T>存根,该存根返回您想要的类型的存根:

IEnumerator<T> enumerator = MockRepository.GenerateStub<IEnumerator<T>>();
enumerator.Stub(x => x.MoveNext()).Return(true);
enumerator.Stub(x => x.Current).Return(MockRepository.GenerateStub<T>());
enumerator.Stub(x => x.MoveNext()).Return(false);

IEnumerable<T> collection = MockRepository.GenerateStub<IEnumerable<T>>();
collection.Stub(x => x.GetEnumerator()).Return(enumerator);

但是,我强烈建议不要尝试模拟IEnumerable. 将 aList<>与单个项目一起使用会更容易最初编写代码并稍后阅读,并且更不脆弱:

List<T> listOfT = new List<T>
{
    MockRepository.GenerateStub<T>()
};

存根/模拟集合接口类型是一个非常糟糕的主意 - 无论如何都要使用接口,但在测试中使用实际集合支持它。

于 2013-09-25T11:46:23.337 回答