Nuestra API tiene una interfaz que hereda de IEnumerable como esto:Rhino se burla: Problema con IEnumerator.MoveNext() de la brasa de una interfaz IEnumerable <T>
public interface IFoos : IEnumerable<IFoo>
{
// Additional foo-collection-specific methods
}
estoy escribiendo una prueba unitaria para una clase que depende de IFoos. Tiene un método que itera sobre una IFoos, así:
public class Bar
{
public IFoos Foos {get; set;}
public void FooItUp()
{
foreach (IFoo foo in this.Foos)
{
foo.JumpAround();
}
}
}
En mi prueba de unidad, me las arreglo para apagar la dependencia y devolver un enumerador con burla de Rhino, así:
[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
...
}
Cuando trato de ejecutar esta prueba, se produce una excepción:
System.InvalidOperationException : Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw.
en cuanto a la interfaz IEnumerable, sin embargo, el único método que se tienen que aplicar o establecer un valor de retorno para es GetEnumerator() que hice una bove, ¿verdad? ¿Por qué el bucle foreach en Bar.FooItUp() simplemente no llama a MoveNext() en el enumerador de lista?
Accesorios principales para los nombres de tus pruebas/burlas/código de ejemplo. :-) –