2011-10-25 5 views
5

Cuando se trabaja con Rhino.Mocks con un objeto de burla en la mano:¿Cómo puedo pasar una prueba unitaria inmediatamente después de invocar un método esperado en el objeto simulado?

¿Hay una manera de pasar una prueba de la unidad una vez que un método esperado se llama sin ejecutar las líneas después de la llamada a este método esperado?

Gracias

+0

¿Desea que el simulacro pueda indicar que la prueba está completa? – rerun

+0

Sí; La razón es que si no 'arrrange' algunos objetos que se tocan después de esta llamada a método, tengo una excepción. Y no me parece significativo ampliar mi prueba solo para evitar una excepción, mientras que me convencen de que la prueba se aprueba llamando a ese método esperado. – pencilCake

+5

Creo que debería arreglar mejor su diseño que ofuscar el flujo de ejecución de sus pruebas. Sin saber más detalles es difícil decir cuál es el problema, pero parece que tienes un método que hace más de una cosa (lo que estás probando más lo que quieres omitir), violando el principio de responsabilidad única. – hammar

Respuesta

2

Desde RhinoMocks 3.5 se puede utilizar agradable AssertWasCalled()

this.Service.BuldMessage("messageId"); 
this.Service.AssertWasCalled(x => x.GenerateMessage("messageId"), messageId)); 

EDIT: Respuesta a comentar

Rhino Mock no se encarga de cambiar el flujo de ejecución de la prueba, así que hay que utilizar NUnit afirma, método Assert.Pass() utilidad le permite terminar de inmediato la prueba, la grabación como un éxito:

if (this.Service.AssertWasCalled(...))) 
{ 
    Assert.Pass("well done"); 
} 

PD: como otros sugirieron considerar rediseño de la prueba unitaria que lo obligó a hacer dicha salida de prueba condicional.

+0

Sé esto. Pero lo que quiero decir es: una vez que se llama, DEJE de ejecutar el método porque la prueba ya pasó como sucedió. – pencilCake

+0

@pencilCake: He actualizado mi respuesta – sll

2

Puede utilizar el AssertWasCalled() en Rhino.Mocks

Su expectativa de que la prueba debe detenerse si se llama al método y no debe ejecutar las siguientes líneas significa que usted ha escrito la prueba equivocada. Haga que assert (Nunit u otro) sea la última línea de la prueba y divida la prueba. Probablemente estés probando dos cosas y esa no es una prueba unitaria. No tiene ese tipo de flujo de ramificación en las pruebas. Todas las líneas en las pruebas deben ser ejecutadas. E idealmente, cada prueba debería tener solo una afirmación.

Con el tipo de flujo que está esperando, también pierde la retroalimentación que recibe de las pruebas cuando fallan. Usted no sabe, simplemente mirando el nombre de la prueba, qué falló.

Cuestiones relacionadas