unit-testing - setup - moq verifiable
¿Cuál es la diferencia entre Moq-ing una clase o interfaz? (2)
Si la clase no implementa una interfaz o si el marco de simulación permite simulaciones parciales, entonces querrá poder simular la clase. En el primer caso, porque no hay interfaz para burlarse. En este último caso, puede heredar el comportamiento existente de la clase que no desea simular.
Sin embargo, normalmente querrá que sus clases dependan de las interfaces cuando estén disponibles. En ese caso, no necesita burlarse de una clase que implementa la interfaz. Debería simplemente burlarse de la interfaz para evitar cualquier dependencia en su prueba que no exista en la clase bajo prueba.
He estado usando moq para simular objetos en mis pruebas unitarias y he visto en el sitio sobre moq que es capaz de simular las clases y las interfaces.
Tuve una conversación con uno de mis compañeros de trabajo el otro día y me dijeron que nunca hay una razón para burlarse de las clases y que solo debería burlarme de las interfaces.
Realmente no tenía una respuesta para eso ... y tampoco puedo encontrar ninguna respuesta a eso en el sitio de moq.
¿Es cierto que uno nunca debería burlarse de las clases? Yo diría que no, ya que si eso fuera cierto, Moq ni siquiera lo permitiría ... Entonces, ¿hay algún momento en el que sea mejor burlarse de una clase sobre una interfaz? ¿Cuál es la diferencia entre burlarse de una clase o burlarse de una interfaz? ¿O realmente es solo una cuestión de preferencia?
Burlarse de una clase es perfectamente válido. Sin embargo, con MoQ, solo puedes simular métodos virtuales y propiedades en una clase.
Es útil cuando tiene clases base abstractas en lugar de interfaces, o clases con implementaciones predeterminadas y virtuales como puntos de extensión. Hay muchos casos en los que no tiene acceso al código fuente de las clases que necesita para burlarse. Hay muchos ejemplos en el marco .Net, por ejemplo, MembershipProvider.