La prueba, aunque puede llevar mucho tiempo, es un paso importante en el ciclo de desarrollo de cualquier aplicación. Le garantiza detectar errores y problemas desde el principio antes de enviar el código a producción.

Puede usar Jest para probar una API Express Rest. Una vez que haya creado una API CRUD simple, descubra cómo escribir pruebas para cada punto final.

¿Qué es la broma?

Hay muchas bibliotecas de prueba de JavaScript entre las que puede elegir, pero Broma es el más fácil para empezar. Es una biblioteca de prueba desarrollada por Facebook, que se utiliza principalmente para probar proyectos de React. Sin embargo, también puede usarlo para probar Node y otros proyectos basados ​​en JavaScript. Se desarrolló sobre Jasmine, otra herramienta de prueba, y viene con su propia biblioteca de aserciones.

Si bien no necesitará una biblioteca de aserciones para escribir pruebas en Jest, necesitará usar una herramienta para realizar solicitudes HTTP. Este artículo utiliza SuperTest.

¿Qué es SuperTest?

instagram viewer

superprueba es una biblioteca de prueba de nodos para llamadas HTTP. Amplía la biblioteca de pruebas de superagent y le permite realizar solicitudes como GET, POST, PUT y DELETE.

SuperTest proporciona un objeto de solicitud que puede usar para realizar solicitudes HTTP.

constante solicitud = requerir("superprueba")
solicitud("https://icanhazdadjoke.com")
.obtener('/slack')
.final(función(err, res) {
si (errar) lanzar errar;
consola.Iniciar sesión(resolución.cuerpo.archivos adjuntos);
});

Aquí, pasa la URL base de la API al objeto de solicitud y luego encadena el método HTTP con el resto de la URL. los final() El método llama al servidor API y la función de devolución de llamada maneja su respuesta.

Una vez que obtenga la respuesta de la API, puede usar Jest para validarla.

Crear una API Express

Para probar sus propios puntos finales de API, debe crear una API REST primero. La API que creará es bastante simple. Inserta, recupera, actualiza y elimina elementos de una matriz.

Comience creando un nuevo directorio llamado node-jest e inicializando npm.

broma de nodo mkdir
npm inicializar -y

A continuación, cree un nuevo archivo llamado índice.js y crear el servidor Express.

constante expresar = requerir("Rápido")
constante aplicación = expreso()
aplicación.escuchar (3000, () => consola.log("Escuchando en el puerto 3000"))

Pruebe el punto final GET /todos

El primer punto final que creará es el punto final GET /todos. Devuelve todos los elementos de la matriz. En index.js, agregue lo siguiente.

constante todos = [
];
// Obtener todos
aplicación.obtener("/todos", (requerido, res) => {
devolverresolución.estado(200).json({
datos: todos,
error: nulo,
});
});

Tenga en cuenta que la respuesta tiene un código de estado de 200 y un objeto JSON que contiene el elemento de tareas pendientes en una matriz llamada datos y un mensaje de error. Esto es lo que probarás usando Jest.

Ahora, instala Jest y SuperTest:

npm Instalar en pc superprueba de broma

Luego, agregue un script de prueba en paquete.json como sigue:

{
"guiones": {
"prueba": "broma"
}
}

Antes de comenzar a escribir sus propias pruebas, debe comprender cómo escribir una prueba básica en Jest.

Considere la siguiente función:

funciónsuma(un, b) {
devolver a + b;
}
módulo.exportaciones = suma;

En el archivo de prueba, debe:

  • Importar la función.
  • Describa lo que debe hacer la prueba.
  • Llame a la función.
  • Afirme la respuesta esperada con la respuesta real de la función.
constante {suma} = requerir("./suma")
describir("Suma de dos elementos", asíncrono() => {
prueba("Debería volver 4", () => {
suponer(suma(2,2)).ser - estar(4)
})
})

los describir palabra clave especifica el grupo de pruebas y el prueba declaración especifica la prueba específica. Si el valor devuelto por la función coincide con el valor pasado a ser - estar, la prueba pasa.

Al probar los puntos finales de la API, no llamará a una función, sino que enviará una solicitud mediante SuperTest u otra biblioteca de cliente HTTP.

Volviendo al punto final GET, cree un nuevo archivo llamado api.prueba.js. Aquí es donde escribirá todas las pruebas de punto final. Nombrar el archivo de prueba con un .prueba infix asegura que Jest lo reconozca como un archivo de prueba.

En api.test.js, importe supertest y configure la URL base de la siguiente manera:

constante solicitud = requerir("superprueba")
constante baseURL = "http:// host local: 3000"

A continuación, cree la primera prueba en el bloque de descripción:

describir("OBTENER /todos", () => {
constante nuevoTodo = {
identificación: cripto.aleatorioUUID(),
artículo: "Beber agua",
terminado: falso,
}
antes de todo(asíncrono () => {
// configurar el todo
espera de solicitud (baseURL).post("/todo").send (nuevoTodo);
})
después de todo(asíncrono () => {
esperar solicitud (URL base).eliminar(`/hacer/${nuevoTodo.id}`)
})
eso("debería devolver 200", asíncrono () => {
constante respuesta = esperar solicitud (URLbase).get("/todos");
suponer(respuesta.código de estado).ser - estar(200);
suponer(respuesta.cuerpo.error).ser - estar(nulo);
});
eso("debería devolver todos", asíncrono () => {
constante respuesta = esperar solicitud (URLbase).get("/todos");
esperar (respuesta.cuerpo.datos.longitud >= 1).ser - estar(verdadero);
});
});

Antes de ejecutar las pruebas, deberá definir las funciones de configuración y desmontaje. Estas funciones llenarán la matriz de tareas pendientes con un elemento antes de la prueba y eliminarán los datos ficticios después de cada prueba.

El código que se ejecuta antes de todas las pruebas está en la función beforeAll(). El código que se ejecuta después de todas las pruebas está en la función afterAll().

En este ejemplo, simplemente está presionando los puntos finales POST y DELETE para cada uno. En una aplicación real, probablemente se conectaría a una base de datos simulada que contiene los datos de prueba.

En esta prueba, primero realizó una solicitud al extremo GET /todos y comparó la respuesta enviada con los resultados esperados. Este conjunto de pruebas pasará si la respuesta tiene un Código de estado HTTP de 200, los datos no están vacíos y el mensaje de error es nulo.

Probar el punto final POST /todo

En index.js, cree el punto final POST /todo:

aplicación.post("/todo", (requerido, res) => {
probar {
constante { id, elemento, completado } = req.body;
constante nuevoTodo = {
identificación,
artículo,
terminado,
};
todos.empujar(nuevoTodo);
devolverresolución.estado(201).json({
datos: todos,
error: nulo,
});
} captura (error) {
devolverresolución.estado(500).json({
datos: nulo,
error: error,
});
}
});

En esta prueba, deberá enviar los detalles de todo en el cuerpo de la solicitud utilizando el método send().

solicitud (URL base). publicación ("/todo").send (nuevoTodo)

La solicitud POST /todo debe devolver un código de estado 201 y la matriz de todos con el nuevo elemento agregado al final. Así es como se vería la prueba:

describir("POST /hacer", () => {
constante nuevoTodo = {
// que hacer
}
después de todo(asíncrono () => {
esperar solicitud (URL base).eliminar(`/hacer/${nuevoTodo.id}`)
})
eso("debe agregar un elemento a la matriz de todos", asíncrono () => {
constante respuesta = esperar solicitud (URLbase).post("/todo").send(newTodo);
constante lastItem = respuesta.cuerpo.datos[respuesta.cuerpo.datos.longitud-1]
suponer(respuesta.código de estado).ser - estar(201);
suponer(último artículo.artículo).ser - estar(nuevoTodo["artículo"]);
suponer(último artículo.terminado).ser - estar(nuevoTodo["terminado"]);
});
});

Aquí, está pasando los datos de tareas pendientes al método send() como argumento. La respuesta debe tener un código de estado 201 y también contener todos los elementos pendientes en un objeto de datos. Para probar si realmente se creó todo, verifica si la última entrada en los todos devueltos coincide con la que enviaste en la solicitud.

El extremo PUT /todos/:id debe devolver el elemento actualizado:

aplicación.poner("/todos/:id", (requerido, res) => {
probar {
constante id = req.params.id
constante todo = todos.find((todo) => todo.id == id);
si(!hacer) {
lanzarnuevoError("Todo no encontrado")
}
todo.completed = req.body.completed;
devolverresolución.estado(201).json({
datos: todo,
error: nulo,
});
} captura (error) {
devolverresolución.estado(500).json({
datos: nulo,
error: error,
});
}
});

Pruebe la respuesta de la siguiente manera:

describir("Actualizar una tarea pendiente", () => {
constante nuevoTodo = {
// que hacer
}
antes de todo(asíncrono () => {
espera de solicitud (baseURL).post("/todo").send (nuevoTodo);
})
después de todo(asíncrono () => {
esperar solicitud (URL base).eliminar(`/hacer/${nuevoTodo.id}`)
})
eso("debe actualizar el elemento si existe", asíncrono () => {
constante respuesta = esperar solicitud (URL base).put(`/todas/${nuevoTodo.id}`).enviar({
terminado: verdadero,
});
suponer(respuesta.código de estado).ser - estar(201);
suponer(respuesta.cuerpo.datos.terminado).ser - estar(verdadero);
});
});

El valor completado en el cuerpo de la respuesta debe ser verdadero. Recuerde incluir la identificación del elemento que desea actualizar en la URL.

Pruebe el punto final DELETE /todos/:id

En index.js, cree el extremo DELETE. Debería devolver los datos de tareas pendientes sin el elemento eliminado.

aplicación.eliminar("/todos/:id", (requerido, res) => {
probar {
constante id = req.params.id
constante todo = todos[0]
si (hacer) {
todos.empalme(identificación, 1)
}
devolverresolución.estado(200).json({
datos: todos,
error: nulo,
});
} captura (error) {
devolverresolución.estado(500).json({
datos: nulo,
error: error,
});
}
});

Para probar el punto final, puede verificar si el elemento eliminado todavía existe en los datos devueltos:

describir("Eliminar una tarea pendiente", () => {
constante nuevoTodo = {
// que hacer
}
antes de todo(asíncrono () => {
espera de solicitud (baseURL).post("/todo").send (nuevoTodo);
})
eso("debe eliminar un elemento", asíncrono () => {
constante respuesta = esperar solicitud (URL base).eliminar(`/todas/${nuevoTodo.id}`);
constante todos = respuesta.cuerpo.datos
constante existe = todos.find (todo => {
newTodo.id == todoId
})
esperar (existe).toBe(indefinido)
});
});

Los datos devueltos desde el extremo DELETE no deben contener el elemento eliminado. Dado que los elementos devueltos están en una matriz, puede usar Array[id] para verificar si la API eliminó el elemento correctamente. El resultado debe ser falso.

Creación de API REST

En este artículo, aprendió cómo probar una API Express Rest usando la API Jest. Escribió pruebas para las solicitudes HTTP GET, PUT, POST y DELETE y vio cómo enviar datos al punto final en la URL y la solicitud. Debería poder aplicar este conocimiento al probar su propia API Rest.