No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Pruebas al endpoint de producto

21/25
Recursos

¿Cómo escribir pruebas para el endpoint de productos?

En el fascinante mundo del desarrollo de software, escribir pruebas efectivas es crucial para garantizar la calidad de nuestras aplicaciones. En este contexto, nos enfocaremos en la creación de pruebas para el endpoint que retorna todos los productos de una tienda en línea. Estas pruebas asegurarán que la aplicación funcione correctamente, incluso después de realizar cambios en el código.

¿Cómo iniciar con las pruebas de productos?

Primero, creamos un archivo nuevo de pruebas llamado products.end2end.js. A diferencia de los endpoints protegidos que requieren un access token, este endpoint es de acceso libre, facilitando su prueba. Partimos de un set de datos que contiene cuatro productos. Nuestro objetivo será confirmar que el endpoint retorna exactamente esos cuatro artículos.

Código de prueba inicial

// products.end2end.js

// Realizamos una petición a nuestro endpoint de productos
const response = await api.get('/api/v1/products');

// Verificamos el código de estado HTTP
expect(response.status).toBe(200);

// Comprobamos que el tamaño del conjunto de productos coincida con el de la base de datos
const productsInDb = await models.Product.find();
expect(response.body.length).toBe(productsInDb.length);

Ejecutamos la prueba desde la terminal con el comando npm run end2end y verificamos que se ejecute exitosamente, asegurando la correspondencia entre los productos retornados y los almacenados.

¿Cómo verificar la categoría anidada en los productos?

Algunas aplicaciones requieren que cada producto incluya información anidada, como una categoría. Esto es crucial para mantener la integridad y funcionalidad del frontend, especialmente durante el mantenimiento de la API.

Verificación de anidación de categoría

Añadimos una prueba para garantizar que cada producto incluya su categoría:

// Accedemos al primer producto del array retornado
const product = response.body[0];

// Verificamos la existencia del objeto 'category'
expect(product).toHaveProperty('category');

Si por alguna razón, el código que anida la categoría es eliminado o comentado, esta prueba fallará advertiéndonos del error. Esto es especialmente útil para evitar despliegues defectuosos que impacten negativamente en el frontend.

Importancia de estas pruebas

Implementar estas pruebas garantiza que nuestra API maneje correctamente la información, previniendo problemas futuros en la interacción con el frontend. Esta práctica de testing no solo detecta errores potenciales, sino que también es una herramienta invaluable durante el mantenimiento del código, asegurando la robustez y confiabilidad de nuestras aplicaciones.

A medida que profundices más en el temario, te animamos a seguir explorando y practicando con entusiasmo. Recordando siempre: ¡cada prueba es un paso más hacia la excelencia en el desarrollo de software!

Aportes 2

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Yo lo que hice para validar lo de las categorías fue separar el test. Hice un test para validar que funcione el findAll y luego hice uno individual para verificar si los trae por id con el findByPk

const request = require('supertest'); //Para emular los request a la api

const createApp = require('../src/app');
const { models } = require('../src/db/sequelize');
const { upSeed, downSeed } = require('./utils/umzug');

describe('Tests for products  path  ', () => {
  let app = null;
  let server = null;
  let api = null;

  beforeAll(async () => {
    app = createApp();

    server = app.listen(3001);

    api = request(app);

    await upSeed();
  });

  describe('GET /products', () => {
    test('should retrun product list', async () => {
      // Arrange
      const productList = await models.Product.findAll();

      // Act
      const {statusCode, body} = await api.get('/api/v1/products');

      // Assert
      expect(statusCode).toEqual(200);
      expect(body.length).toEqual(productList.length);
    });
  });

  describe('GET /products/{id}', () => {
    test('should retrun a product', async () => {
      // Arrange
      const productId = 1;
      const product = await models.Product.findByPk(productId);
      const categoryProduct = await models.Category.findByPk(product.categoryId);
      // Act
      const {statusCode, body} = await api.get(`/api/v1/products/${productId}`);
      // Assert
      expect(statusCode).toEqual(200);
      expect(body.id).toEqual(product.id);
      expect(body.price).toEqual(product.price);
      expect(body.description).toEqual(product.description);
      expect(body.name).toEqual(product.name);
      expect(body.image).toEqual(product.image);
      expect(body.categoryId).toEqual(product.categoryId);
      expect(body.category.id).toEqual(categoryProduct.id);
      expect(body.category.name).toEqual(categoryProduct.name);
    });
  });

  describe('POST /products', () => {
    test('should return 400 name length and image required', async () => {
      const newProduct = {
        name: 'Test product name',
        description: 'Product description',
        categoryId: 3,
        price: 500
      }

      const {statusCode, body} = await api.post('/api/v1/products').send(newProduct);
      expect(statusCode).toEqual(400);
      expect(body.message).toMatch(/is required/);
      expect(body.message).toMatch(/image/);
      expect(body.message).toMatch(/name/);
    });

    test('should return 201', async () => {
      const newProduct = {
        name: 'Correct name',
        description: 'Product description',
        image: 'https://www.shutterstock.com/image-vector/homer-simpson-cartoon-character-isolated-260nw-2317190887.jpg',
        categoryId: 3,
        price: 500
      }

      const {statusCode, body} = await api.post('/api/v1/products').send(newProduct);
      const checkProduct = await models.Product.findByPk(body.id);

      expect(statusCode).toEqual(201);
      expect(body.name).toEqual(checkProduct.name);
      expect(body.id).toEqual(checkProduct.id);
      expect(body.image).toEqual(checkProduct.image);
      expect(body.categoryId).toEqual(checkProduct.categoryId);
    });

  });

  afterAll(async() => {
    await downSeed();
    server.close()
  });

});

También hice las pruebas para enviar productos

Para regresar el primer product en la BBDD: ```javascript test('should return first product in DB', async () => { const product = await models.Product.findByPk('1'); const { statusCode, body } = await api.get(`${apiUrlBase}/${product.id}`); expect(statusCode).toEqual(200); expect(body.name).toEqual(product.name); }); ```