Rhino mocks: Issue with IEnumerator.MoveNext() when stubbing an IEnumerable interface

Наш API имеет интерфейс, унаследованный от IEnumerable, например:

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

Я пишу модульный тест для класса, который зависит от IFoos. У него есть метод, который выполняет итерацию с IFoo, например:

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, единственный метод, который мне нужно реализовать или установить возвращаемое значение, - это GetEnumerator (), что я сделал выше, верно? Почему цикл foreach в Bar. FooItUp () просто вызывает MoveNext () в перечислителе списка?

6
задан System.Cats.Lol 7 March 2011 в 18:15
поделиться