Las pruebas unitarias son una parte esencial del desarrollo de software, ya que aseguran que cada componente de tu aplicación funcione correctamente de manera aislada. En el contexto de GraphQL, los resolvers son funciones que manejan las solicitudes de datos y, por lo tanto, son cruciales para el correcto funcionamiento de tu API. Este módulo te guiará a través del proceso de escribir y ejecutar pruebas unitarias para resolvers de GraphQL.

Objetivos de Aprendizaje

  • Comprender la importancia de las pruebas unitarias para resolvers.
  • Configurar un entorno de pruebas para resolvers de GraphQL.
  • Escribir y ejecutar pruebas unitarias utilizando herramientas comunes como Jest.
  • Manejar casos de prueba comunes y errores.

  1. Importancia de las Pruebas Unitarias para Resolvers

Las pruebas unitarias te permiten:

  • Verificar la funcionalidad: Asegurarte de que cada resolver devuelve los datos correctos.
  • Detectar errores temprano: Identificar problemas antes de que lleguen a producción.
  • Facilitar el mantenimiento: Hacer cambios en el código con confianza, sabiendo que las pruebas te alertarán de cualquier problema.
  • Documentar el comportamiento: Las pruebas actúan como documentación viva del comportamiento esperado de tus resolvers.

  1. Configuración del Entorno de Pruebas

Instalación de Dependencias

Para comenzar, necesitas instalar algunas dependencias. En este ejemplo, utilizaremos Jest, una popular biblioteca de pruebas para JavaScript.

npm install --save-dev jest
npm install --save-dev @babel/preset-env @babel/preset-typescript

Configuración de Babel

Crea un archivo .babelrc en la raíz de tu proyecto para configurar Babel:

{
  "presets": ["@babel/preset-env", "@babel/preset-typescript"]
}

Configuración de Jest

Añade la configuración de Jest en tu package.json:

"jest": {
  "transform": {
    "^.+\\.(js|ts)$": "babel-jest"
  },
  "testEnvironment": "node"
}

  1. Escribiendo Pruebas Unitarias

Ejemplo de Resolver

Supongamos que tienes el siguiente resolver:

// resolvers.js
const resolvers = {
  Query: {
    user: async (_, { id }, { dataSources }) => {
      return dataSources.userAPI.getUserById(id);
    }
  }
};

module.exports = resolvers;

Escribiendo la Prueba

Crea un archivo de prueba, por ejemplo, resolvers.test.js:

// resolvers.test.js
const resolvers = require('./resolvers');

describe('Resolvers', () => {
  describe('Query.user', () => {
    it('should return the correct user', async () => {
      const mockUser = { id: '1', name: 'John Doe' };
      const mockDataSources = {
        userAPI: {
          getUserById: jest.fn().mockResolvedValue(mockUser)
        }
      };

      const result = await resolvers.Query.user(null, { id: '1' }, { dataSources: mockDataSources });

      expect(result).toEqual(mockUser);
      expect(mockDataSources.userAPI.getUserById).toHaveBeenCalledWith('1');
    });
  });
});

Explicación del Código

  • describe: Agrupa pruebas relacionadas.
  • it: Define una prueba individual.
  • jest.fn(): Crea una función simulada (mock) para getUserById.
  • mockResolvedValue: Configura la función simulada para que devuelva un valor específico cuando se llame.
  • expect: Realiza una aserción sobre el resultado de la función.

  1. Ejecución de las Pruebas

Para ejecutar las pruebas, añade un script en tu package.json:

"scripts": {
  "test": "jest"
}

Luego, ejecuta las pruebas con el siguiente comando:

npm test

  1. Manejo de Casos de Prueba Comunes y Errores

Casos de Prueba Comunes

  • Datos no encontrados: Verifica que el resolver maneje correctamente los casos en los que no se encuentran datos.
  • Errores de red: Simula errores de red y asegúrate de que el resolver los maneje adecuadamente.
  • Validación de entradas: Asegúrate de que el resolver maneje correctamente las entradas inválidas.

Ejemplo de Manejo de Errores

it('should handle errors', async () => {
  const mockDataSources = {
    userAPI: {
      getUserById: jest.fn().mockRejectedValue(new Error('Network error'))
    }
  };

  await expect(resolvers.Query.user(null, { id: '1' }, { dataSources: mockDataSources }))
    .rejects
    .toThrow('Network error');
});

Conclusión

En esta sección, hemos cubierto la importancia de las pruebas unitarias para resolvers de GraphQL, cómo configurar un entorno de pruebas, y cómo escribir y ejecutar pruebas unitarias utilizando Jest. También hemos discutido cómo manejar casos de prueba comunes y errores. Con esta base, estarás mejor preparado para asegurar la calidad y fiabilidad de tus resolvers de GraphQL.

En el siguiente tema, profundizaremos en las pruebas de integración para asegurarnos de que los diferentes componentes de tu aplicación funcionen juntos correctamente.

© Copyright 2024. Todos los derechos reservados