Como no tengo mucha experiencia en pruebas unitarias, estoy tratando de reunir algunas reglas que aprenderé primero.
Tenga cuidado al aprender "reglas" para problemas que nunca ha encontrado. Si se encuentra con alguna "regla" o "práctica recomendada", le sugiero que busque un ejemplo simple de juguete de dónde se supone que se debe usar esta regla, e intente resolver ese problema usted mismo , ignorando lo que dice la "regla".
En este caso, podría intentar crear 2 o 3 clases simples y algunos comportamientos que deberían implementar. Implemente las clases de la manera que se sienta natural y escriba una prueba unitaria para cada comportamiento. Haga una lista de cualquier problema que haya encontrado, por ejemplo, si comenzó con cosas que funcionan de una manera, luego tuvo que regresar y cambiarlo más tarde; si te confundiste sobre cómo se supone que las cosas encajan entre sí; si te molesta escribir boilerplate; etc.
Luego intente resolver el mismo problema siguiendo la "regla". Nuevamente, haga una lista de los problemas que encontró. Compare las listas y piense qué situaciones podrían ser mejores al seguir la regla y cuáles no.
En cuanto a su pregunta real, tiendo a favorecer un enfoque de puertos y adaptadores , donde hacemos una distinción entre "lógica central" y "servicios" (esto es similar a distinguir entre funciones puras y procedimientos efectivos).
La lógica central se trata de calcular cosas "dentro" de la aplicación, en función del dominio del problema. Podría contener clases como User
, Document
, Order
, Invoice
, etc bien de que tenga clases básicas llaman new
para otras clases principales, ya que son detalles de implementación "internos". Por ejemplo, crear un Order
poder también crea un Invoice
y un Document
detalle de lo que se ordenó. No hay necesidad de burlarse de estos durante las pruebas, ¡porque estas son las cosas reales que queremos probar!
Los puertos y adaptadores son la forma en que la lógica central interactúa con el mundo exterior. Aquí es donde cosas como Database
, ConfigFile
, EmailSender
, etc. viven. Estas son las cosas que dificultan las pruebas, por lo que es recomendable crearlas fuera de la lógica central y pasarlas según sea necesario (ya sea con inyección de dependencia o como argumentos de métodos, etc.).
De esta manera, la lógica central (que es la parte específica de la aplicación, donde vive la lógica comercial importante y está sujeta a la mayor rotación) se puede probar por sí sola, sin tener que preocuparse por las bases de datos, archivos, correos electrónicos, etc. Simplemente podemos pasar algunos valores de ejemplo y verificar que obtenemos los valores de salida correctos.
Los puertos y adaptadores se pueden probar por separado, utilizando simulacros para la base de datos, el sistema de archivos, etc. sin tener que preocuparse por la lógica empresarial. Simplemente podemos pasar algunos valores de ejemplo y asegurarnos de que estén almacenados / leídos / enviados / etc. apropiadamente.