2011-03-07 13 views
5

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?

+2

Accesorios principales para los nombres de tus pruebas/burlas/código de ejemplo. :-) –

Respuesta

6

Durrr.

No estaba poniendo mis talones en estado de reproducción antes de actuar sobre ellos.

añadiendo la línea:

mocks.ReplayAll(); 

antes de llamar bar.FooItUp() fija el problema.

2

Prueba a cambiar:

stubFoos.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => x.ReturnValue = fooEnumerator); 

Para:

stubFoos.Stub(x => x.GetEnumerator()).Return(fooEnumerator); 

Editar: información interesante en esa pregunta se ha vinculado.

haber visto, trate:

stubFoos.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => x.ReturnValue = new List<IFoo> { stubFoo1, stubFoo2 }.GetEnumerator()); 
+0

Desafortunadamente, no ir ... así es como se veía inicialmente mi llamada, según esta pregunta: http://stackoverflow.com/questions/391411/mocking-getenumerator-method-of-an-ienumerablet-types –

+0

Tried eso también, desafortunadamente, no hace ninguna diferencia si defino el enumerador en línea. –

+0

Suponiendo que está agregando un tipo de colección dentro de la instancia concreta de IFoos, ¿esa instancia concreta de IFoos permite la inyección de dependencia del tipo de recopilación? Haría eso en lugar de burlarme. –

Cuestiones relacionadas