gpt4 book ai didi

c# - Rhino 在 stub IEnumerable 接口(interface)时模拟 : Issue with IEnumerator. MoveNext()

转载 作者:太空狗 更新时间:2023-10-29 21:19:41 24 4
gpt4 key购买 nike

我们的 API 有一个继承自 IEnumerable 的接口(interface),如下所示:

public interface IFoos : IEnumerable<IFoo>
{
// Additional foo-collection-specific methods
}

我正在为依赖于 IFoos 的类编写单元测试。它有一个迭代 IFoos 的方法,如下所示:

public class Bar
{

public IFoos Foos {get; set;}
public void FooItUp()
{
foreach (IFoo foo in this.Foos)
{
foo.JumpAround();
}
}
}

在我的单元测试中,我设法消除了依赖关系并返回了一个带有 Rhino Mocks 的枚举器,如下所示:

[Test]
public void FooItUp_JumpsUpJumpsUpAndGetsDown()
{
// Arrange
var mocks = new MockRepository();
var stubFoo1 = mocks.Stub<IFoo>();
var stubFoo2 = mocks.Stub<IFoo>();
var stubFoos = mockRepository.Stub<IFoos>().
var fooEnumerator = new List<IFoo> { stubFoo1, stubFoo2 }.GetEnumerator();
stubFoos.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => x.ReturnValue = fooEnumerator);
Bar bar = new bar();
bar.Foos = stubFoos;

// Act
bar.FooItUp();

// Assert
...

}

当我尝试运行这个测试时,抛出了一个异常:

System.InvalidOperationException : Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw.

不过,看看 IEnumerable 接口(interface),我应该实现或设置返回值的唯一方法是我在上面所做的 GetEnumerator(),对吧?为什么 Bar.FooItUp() 中的 foreach 循环不直接调用 List 枚举器上的 MoveNext()?

最佳答案

杜尔。

在对它们进行操作之前,我没有将 stub 置于重放状态。

添加行:

mocks.ReplayAll();

在调用 bar.FooItUp() 之前解决了这个问题。

关于c# - Rhino 在 stub IEnumerable<T> 接口(interface)时模拟 : Issue with IEnumerator. MoveNext(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223368/

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