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

标签 c# .net unit-testing nunit rhino-mocks

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

相关文章:

c# - 不同系列之间的堆叠条形边框

ios - block 无法导入嵌套 block

javascript - 错误 TS2304 : Cannot find name 'createNewEvent'

unit-testing - 获取 TypeScript 类的实例?

c# - 如何最好地在 Web api 和客户端之间显示格式化属性

c# - EventWaitHandle 可以跨进程使用。自动和手动重置事件仅在单个进程中?

c# - 具有后台 worker 的 Web 应用程序的 Nhibernate session 管理策略?

c# - 通过 php 引用 .Net 函数的最佳方法

c# - 在windows phone 8中取消语音合成

c# - 从表中仅选择几列