我们的 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/