Supertest
¿Qué es Supertest?
Supertest es una biblioteca para realizar pruebas de servidores HTTP en Node.js. Se utiliza comúnmente junto con frameworks de prueba como Jest o Mocha. Supertest permite realizar solicitudes HTTP y hacer afirmaciones sobre las respuestas, facilitando la prueba de las API de manera sencilla y efectiva.
Características Principales
- Fácil de Usar: Proporciona una API sencilla para hacer solicitudes HTTP.
- Integración con Jest: Se puede usar fácilmente con Jest para pruebas de integración.
- Soporte para Promesas: Permite utilizar promesas para manejar solicitudes asíncronas.
- Asserts Ricos: Proporciona métodos para hacer afirmaciones detalladas sobre las respuestas.
Instalación
Puedes instalar Supertest a través de npm o yarn. Asegúrate de tener Jest o el framework de prueba que prefieras instalado también.
# usando npm
npm install --save-dev supertest
# usando yarn
yarn add --dev supertest
Configuración
Para usar Supertest, necesitas tener un servidor HTTP que esté escuchando en un puerto. Si estás usando Express, un ejemplo de configuración básica sería:
// server.js
const express = require('express');
const app = express();
app.get('/api', (req, res) => {
res.status(200).json({ message: 'Hello World!' });
});
module.exports = app;
Luego, puedes iniciar el servidor en otro archivo (por ejemplo, index.js):
//no-try-code
// index.js
const app = require('./server');
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
Primer Test con Supertest
A continuación, se muestra cómo realizar una prueba básica utilizando Jest y Supertest. Crea un archivo de prueba, por ejemplo, server.test.js:
const request = require('supertest');
const app = require('./server');
describe('GET /api', () => {
it('debería responder con un mensaje Hello World', async () => {
const response = await request(app).get('/api');
expect(response.status).toBe(200);
expect(response.body.message).toBe('Hello World!');
});
});
Explicación:
request(app): Crea una instancia de Supertest con tu aplicación Express..get('/api'): Realiza una solicitud GET a la ruta especificada.expect: Utiliza Jest para hacer afirmaciones sobre la respuesta.
Pruebas Asíncronas
Supertest funciona bien con pruebas asíncronas utilizando async/await como en el ejemplo anterior. Asegúrate de usar async en la función de prueba para poder usar await.
Pruebas de Otras Métodos HTTP
Supertest también permite probar otros métodos HTTP como POST, PUT y DELETE. Aquí hay un ejemplo de cómo probar un método POST:
app.post('/api/data', (req, res) => {
const { name } = req.body;
res.status(201).json({ message: `Hello, ${name}!` });
});
// Test para el método POST
describe('POST /api/data', () => {
it('debería responder con un mensaje personalizado', async () => {
const response = await request(app)
.post('/api/data')
.send({ name: 'John' }); // Enviando el cuerpo de la solicitud
expect(response.status).toBe(201);
expect(response.body.message).toBe('Hello, John!');
});
});
Manejo de Errores
Puedes probar situaciones de error asegurándote de que tu API responda correctamente. Por ejemplo, puedes probar un endpoint que devuelve un error 404:
app.get('/api/notfound', (req, res) => {
res.status(404).json({ error: 'Not Found' });
});
// Test para un error 404
describe('GET /api/notfound', () => {
it('debería responder con un error 404', async () => {
const response = await request(app).get('/api/notfound');
expect(response.status).toBe(404);
expect(response.body.error).toBe('Not Found');
});
});
Conclusión
Supertest es una herramienta poderosa y fácil de usar para realizar pruebas de API en Node.js. Su integración con Jest facilita la creación de pruebas robustas y efectivas. Con Supertest, puedes probar las respuestas de tus API de forma sencilla y asegurarte de que funcionen como se espera.