Sinon para JavaScript (Node.js): guía completa con ejemplos
1. ¿Qué es Sinon y para qué sirve?
Sinon.js es una potente librería para JavaScript que proporciona dobles de prueba independientes: espías (spies), stubs (stubs) y mocks (mocks). No depende de ningún framework de pruebas específico (Mocha, Jest, Jasmine, etc.) y se puede usar con cualquiera de ellos. El objetivo principal de Sinon es aislar el código bajo prueba de dependencias externas (bases de datos, APIs, sistema de archivos, temporizadores), permitiendo verificar el comportamiento de las funciones en un entorno controlado.
¿Por qué es necesario? En aplicaciones reales, las funciones suelen llamar a otras funciones, acceder a servicios externos o trabajar con operaciones asíncronas. Sin Sinon, no podrías verificar fácilmente si se llamó a una función de callback, con qué argumentos, cuántas veces, o simular una respuesta del servidor. Sinon resuelve estos problemas de forma elegante y concisa, haciendo que las pruebas sean rápidas, fiables y predecibles.
La librería es especialmente popular en el ecosistema Node.js, donde las pruebas unitarias son fundamentales. Permite probar funciones sin ejecutar solicitudes HTTP reales, sin acceder a la base de datos y sin esperar temporizadores. Esto acelera la ejecución de las pruebas decenas de veces y las hace deterministas.
2. Instalación
Sinon se instala a través de npm. Para Node.js, ejecuta el comando:
npm install sinon --save-dev
Si usas TypeScript, instala también los tipos:
npm install sinon @types/sinon --save-dev
Para usar en el navegador, puedes incluir la versión CDN:
<script src="https://cdn.jsdelivr.net/npm/sinon@latest/pkg/sinon.js"></script>
Después de la instalación, importa la librería en tu archivo de prueba:
const sinon = require('sinon'); // CommonJS
// o
import sinon from 'sinon'; // ES Modules
3. Inicio rápido — ejemplo mínimo funcional
Veamos un ejemplo sencillo: una función que llama a un callback con un saludo. Queremos verificar que el callback fue llamado con el argumento correcto.
const sinon = require('sinon');
// Función que estamos probando
function greet(name, callback) {
callback(`¡Hola, ${name}!`);
}
// Prueba usando un espía (spy)
const callbackSpy = sinon.spy();
greet('Ana', callbackSpy);
console.log(callbackSpy.calledOnce); // true
console.log(callbackSpy.calledWith('¡Hola, Ana!')); // true
Este ejemplo muestra la idea básica: creamos un espía, lo pasamos a la función bajo prueba y luego verificamos cómo fue llamado. En pruebas reales, usarás aserciones (assertions) de tu framework de pruebas.
4. Métodos/funciones/clases principales
4.1. sinon.spy() — Espía
Firma: sinon.spy([objeto], [método]) o sinon.spy([func])
Qué hace: Crea un espía que registra información sobre las llamadas a la función: número de llamadas, argumentos, contexto, valor de retorno. Puede envolver una función existente o reemplazar un método de un objeto.
Ejemplo:
const usuario = {
setNombre: function(nombre) { this.nombre = nombre; }
};
const spy = sinon.spy(usuario, 'setNombre');
usuario.setNombre('Juan');
console.log(spy.calledOnce); // true
console.log(spy.calledWith('Juan')); // true
console.log(spy.firstCall.args); // ['Juan']
spy.restore(); // siempre restaurar el método original
4.2. sinon.stub() — Stub (simulacro)
Firma: sinon.stub([objeto], [método])
Qué hace: Crea un simulacro que reemplaza una función y permite predefinir su comportamiento: devolver un valor específico, lanzar una excepción, llamar a un callback, etc. Ideal para simular dependencias externas.
También en la biblioteca
Planificador de tareas PHP: gestor de colas similar a cron en PHP
Envío de correo electrónico en PHP: Guía completa de la biblioteca PHPMailer
Cliente HTTP para Java: revisión de las mejores bibliotecas (Java 11, Apache, OkHttp, Retrofit)
Cliente HTTP para Go (Golang): mejores bibliotecas para trabajar con la red
Event Bus y patrón Observer en C++: implementación en C++ moderno