Testing Unitario en Go: Uso de Mock Services
Clase 20 de 30 • Curso de Go Intermedio: Programación Orientada a Objetos y Concurrencia
Resumen
¿Qué es el testing con mocks y su importancia?
El testing con mocks es una técnica esencial en el desarrollo de software que permite probar unidades individuales de código, aislándolas de sus dependencias externas. Un ejemplo común es cuando una función realiza consultas en una base de datos; en lugar de hacer llamadas reales a la base de datos durante el test, se utilizan mocks para simular ese comportamiento. De esta manera, se puede probar la lógica de la función sin depender de factores externos.
¿Cómo se implementa un mock en Go?
Vamos a implementar un mock en Go, comenzando con la creación de funciones que originalmente realizan acciones específicas, como obtener información de una base de datos. Luego se redefinen como variables para poder reasignarles diferentes comportamientos durante el test.
Ejemplo básico
- Definición de funciones originales: Se crean funciones como
getPersonByDNI
ygetEmployeeByID
que simulan consultas de base de datos.
func getPersonByDNI(dni string) (Person, error) {
// Simula lectura de base de datos
return Person{}, nil
}
func getEmployeeByID(id int) (Employee, error) {
// Simula lectura de base de datos
return Employee{}, nil
}
- Reasignación de funciones como variables: Para poder modificar su comportamiento durante el test, se declaran como variables.
var getPersonByDNI = func(dni string) (Person, error) {
return Person{}, nil
}
var getEmployeeByID = func(id int) (Employee, error) {
return Employee{}, nil
}
¿Cómo crear y utilizar un mock en tests?
Después de establecer las funciones como variables, se procede a redefinirlas dentro del test para que simulen el comportamiento deseado.
Ejemplo de test con mocks
func TestGetFullTimeEmployeeByID(t *testing.T) {
// Definimos la función mock
mockGetEmployeeByID := func(id int) (Employee, error) {
return Employee{ID: 1, Position: "CEO"}, nil
}
mockGetPersonByDNI := func(dni string) (Person, error) {
return Person{Name: "John Doe", Age: 35, DNI: "1"}, nil
}
// Asignamos los mocks a nuestras variables de función
getEmployeeByID = mockGetEmployeeByID
getPersonByDNI = mockGetPersonByDNI
// Aquí se procede con las pruebas utilizando los mocks
// ...
}
Este enfoque de testing utilizando mocks facilita aislar la lógica que se desea probar, evitando que las pruebas dependan de otros componentes del sistema como la base de datos u otros servicios externos.
¿Por qué es importante la modularidad y la reutilización con mocks?
Utilizando mocks, los desarrolladores pueden:
- Reducir dependencias externas: La prueba no se ve afectada por servicios externos o estados de base de datos.
- Acelerar tiempos de prueba: Las ejecuciones son más rápidas al no depender de factores externos.
- Mejorar la comprensión: El desarrollo de pruebas unitarias centradas únicamente en la función objetivo facilita la comprensión de la lógica interna y permite detectar errores más rápidamente.
Adoptar la técnica de mocking en pruebas unitarias representa un gran paso hacia la mejora continua en proyectos de software, propiciando un código más limpio, comprensible y fácil de mantener.