2009-12-25 8 views
5

Quiero usar Moq, pero estoy usando Nhibernate y no creé interfaces para todas mis clases de modelos (clases POCO).Para que use Moq, ¿todas mis clases tienen que implementar una interfaz?

¿Tengo que crear una interfaz para cada clase para que pueda moqar mis clases de POCO?

+1

Usted acaba de preguntar esto. No repita http://stackoverflow.com/questions/1961778/help-with-this-unit-test-using-moq –

+0

Aconsejaría cerrar/eliminar su otra pregunta si puede. Las respuestas aquí son lo que quieres. No hay punto para duplicarlos. – Finglas

+0

Vamos a cerrar su otra pregunta en lugar de cerrar esta: esto parece más claro, y podría tener valor para los demás. – TrueWill

Respuesta

8

Puede simular métodos virtuales, pero es mejor si utiliza una interfaz.

razón que digo esto es la siguiente:

var mockObject = new Mock<IMyObject>(); 

Si se utiliza un método virtual se convierte en:

var mockObject = new Mock<MyObject>(params...); 

Estás obligados para incluir los parámetros de objetos concretos, pero obviamente no es necesario para las interfaces. Todas las pruebas que usan clases concretas requerirán actualización si decides cambiar el constructor de la clase en una fecha posterior. Me he quemado por esto en el pasado, así que trate de no usar métodos virtuales para probar más.

Debo agregar que al intentar simular tipos de concreto, está derrotando el propósito de los marcos de burla. Debería ser mocking roles, not types. Por lo tanto, trabajando para una abstracción, en este caso una interfaz es una gran cosa para hacer.

Otra razón es cómo funcionan las interfaces, las interfaces establecen un contrato, pero no el comportamiento. Deben usarse cuando tienes implementaciones múltiples, y clasifico las pruebas como un comportamiento, de ahí la razón válida para introducir una nueva interfaz.

+0

Estoy de acuerdo en favorecer las interfaces. Sin embargo, hay algunos casos en que las clases abstractas tienen más sentido (como el Patrón de método de plantilla). Como de costumbre, estas son pautas: use su propio juicio. – TrueWill

1

Las clases/métodos que utiliza Mocking o bien deben implementar una interfaz o ser virtuales. Puede probar cualquier clase/método siempre que sea accesible, pero no hay forma de burlarse de algo que no puede ser anulado o implementado explícitamente.

Cuestiones relacionadas