Sinon para JavaScript (Node.js): guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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.

Recommendations