2009-05-31 10 views
9

Al ejecutar la segunda línea de este código burla de Rhino lanza un InvalidOperationException con un mensaje "Esta acción no es válido cuando el objeto maqueta está en estado de reproducción"¿Cuándo un objeto simulado ingresa al estado de reproducción?

var mockScanner = MockRepository.GenerateMock<PortScanner>(null); 
     mockScanner.Expect((scanner => { scanner.Scan(null, null); })); 

recorrer el código en un depurador se puede ver la El depurador ejecuta el método definido en la clase e inmediatamente después de que el control deja este método, se produce la excepción.

Este código similar en otra prueba hace el trabajo sin ningún problema

var mockView = MockRepository.GenerateMock<IScanView>(null); 
     mockView.Expect(view => { view.Close(); }); 
     var controller = new ScanController(mockView); 
     controller.Exit(); 
     mockView.VerifyAllExpectations(); 

La única diferencia de que se me ocurre que podría ser de cualquier consequense entre theese dos pruebas es que la salida es un miembro de una interfaz mientras Scan es un miembro virtual en una clase

¿Qué me estoy perdiendo?

actualización
La exploración adicional ha indicado que esto está relacionado con la forma en que maneja Rhino métodos virtuales. Me estoy centrando en el estudio de la documentación ahora.

Respuesta

12

La excepción fue causada debido burla de Rhino no tenía el nivel requerido de acceso al tipo con el fin de burlarse de forma adecuada. La concesión del acceso interno al ensamblaje de Rhino Mocks utilizando InternalsVisibleTo resolvió el problema.

Cabe destacar que esto no afecta a las interfaces. Creo que la razón de esto es porque el marco burlón necesita anular la implementación en una clase donde no hay ninguno en una interfaz.

+1

Acabo de leer sobre hacer esto hoy. El enlace de documentación a la entrada de la wiki de Rhino Mocks es: http://ayende.com/Wiki/(S(vcy2bn55h5cja0vsedn14y45))/Rhino+Mocks+-+Internal+Methods.ashx –

0

¿Qué sucede si elimina el conjunto adicional de paréntesis de la primera expresión?

var mockScanner = MockRepository.GenerateMock<PortScanner>(null); 
mockScanner.Expect(scanner => { scanner.Scan(null, null); }); 
+0

Entonces mi sintaxis se vuelve un poco más clara (gracias :)), desafortunadamente mi prueba todavía arroja – Crippledsmurf

+0

Cualquier importancia para el parámetro nulo en el constructor. ¿Qué sucede si pasa un objeto válido allí en lugar de nulo? – tvanfosson

+0

Normalmente son objetos de dirección IP que pasan a través de un controlador real. Son nulas porque es más conveniente escribir que cualquier otra cosa (son las 3:47 AM), pero ahora mismo el método es un stub vacío que no usa los parámetros en cualquier lugar. También los probé con valores de parámetros reales. Todavía me da igual la misma excepción Creo que esto es una señal de que soy oficialmente demasiado viejo para codificar tan tarde ahora – Crippledsmurf

Cuestiones relacionadas