Actualmente mi proyecto se compone de varias clases concretas. Ahora que estoy entrando en las pruebas unitarias, parece que se supone que debo crear una interfaz para cada clase (¿se dobla efectivamente el número de clases en mi proyecto)? Resulta que estoy usando Google Mock como un marco de burla. Ver Google Mock CookBook on Interfaces. Mientras que antes podría tener solo las clases Car
y Engine
, ahora tendría clases abstractas (también conocidas como interfaces C++) Car
y Engine
y luego las clases de implementación CarImplementation
y EngineImpl
o lo que sea. Esto me permitiría anular la dependencia de Car
en Engine
.Pruebas unitarias: ¿codificación en las interfaces?
Hay dos líneas de pensamiento que he encontrado en la investigación de este:
Sólo use las interfaces en las que puede tener la necesidad de más de un implementación de una abstracción dada y/o para su uso en public APIs, , de lo contrario, no cree interfaces innecesariamente.
pruebas unitarias talones/burla menudo son la "otra aplicación", y por lo tanto, sí, se deben crear intefaces.
Cuando estoy probando la unidad, ¿debo crear una interfaz para cada clase en mi proyecto? (Me inclino por crear interfaces para facilitar la prueba)
Gracias por su respuesta; Estoy intentando asimilarlo. ¿Estás diciendo que las pruebas de Whitebox no son una buena opción para los simulacros? La forma en que estoy viendo las pruebas unitarias es que estoy tratando de probar cada unidad de código. Entonces, por ejemplo, quiero probar 'Car' y' Car' depende de una clase 'Engine'. Para asegurarme de que estoy haciendo una prueba de * unit * y no de * integración *, * necesito * burlarme de la clase 'Engine' (y de una forma u otra obtengo' Car' para usar mi 'Engine' burlado) . De lo contrario, estoy probando dos clases y haciendo una prueba de integración, no una prueba de unidad. Y para burlarse fácilmente de la clase 'Engine' parece que necesita ser una interfaz. – User
la única diferencia aquí es qué representa * una * unidad. Por lo general, para algunas personas una unidad que se probará representa una unidad de compilación, o una clase, pero no tiene que ser así. Por ejemplo, si crea una clase de gráfico, nodo y borde estarán altamente acoplados entre sí, por lo que es bastante inútil probarlos de forma aislada.Simplemente envuelva todo el módulo gráfico en una interfaz de fachada y cuando otros módulos necesiten interactuar con una representación simulada de gráfico, simule la fachada del gráfico, no las clases individuales (como una fachada adecuada, necesitará representaciones de nivel de API de los nodos, como enteros o id) – lurscher
En mi comprensión de las pruebas unitarias, si la clase edge usa la clase de nodo, entonces cuando estoy probando la clase de borde, me gustaría burlarme de la clase de nodo porque no quiero probar dos "unidades" al mismo tiempo. Si falla una prueba de clase de borde, no sabría si fue el borde o el nodo el que realmente falló. Creo que llamaría a lo que estás diciendo sobre las pruebas de integración (darte cuenta de que es solo semántica hasta cierto punto). – User