Unit Testing

Clase 23 de 28Curso para Certificacion de Node.js con OpenJS Foundation 2023

Resumen

Aprende a resolver con confianza el dominio de unit testing del examen JSNAT. Aquí tienes un enfoque directo para cubrir el último ejercicio: elegir un framework, escribir tres aserciones claras con deep equal y ejecutar los tests con npm test. Dominarás validaciones de string, manejo de errors y pruebas sobre objects sin complicaciones.

¿Qué evalúa el dominio de unit testing en JSNAT?

Este dominio pesa 6% y se resuelve con un único ejercicio (task 13.1). Se trabaja sobre un aplicativo de Node y el reto central es testear un módulo con tres resultados posibles.

  • Usa un framework de pruebas en Node: Tape, Mocha o Abba. Evita Jest por problemas en la certificación.
  • Conoce bien el framework elegido y una librería de aserciones si la necesitas.
  • El archivo a probar es toTest.js y el test va en answer.js.

¿Qué hace el módulo toTest.js?

El module exporta una única función que recibe un argumento tipo string y contempla tres salidas:

  • Si el string corresponde a un usuario válido: retorna un user object.
  • Si no es un usuario: retorna un object con un error message (por ejemplo: not found).
  • Si el argumento no es string: hace throw de un TypeError.

¿Cómo testear los tres casos con Mocha y deep equal?

La solución propone tres aserciones con nombres claros usando la convención de Mocha: it returns an user object, it returns an object with an error y throws an error. Al comparar objects, utiliza deep equal.

  • Caso 1: usuario válido devuelve un objeto con las claves esperadas (por ejemplo: password y role).
  • Caso 2: usuario inexistente devuelve { error: 'not found' }.
  • Caso 3: un argumento que no es string lanza TypeError.

¿Cómo se vería el test en answer.js?

// answer.js
const toTest = require('./toTest');

it('returns an user object', () => {
  const result = toTest('admin');
  // estructura esperada con password y role.
  expect(result).to.deep.equal({
    password: '...', // valores según toTest.js
    role: '...'      // valores según toTest.js
  });
});

it('returns an object with an error', () => {
  const result = toTest('no user');
  expect(result).to.deep.equal({ error: 'not found' });
});

it('throws an error', () => {
  const call = () => toTest(123);
  expect(call).to.throw(TypeError);
});

¿Cómo configurar package.json para npm test?

Define el script de prueba para ejecutar Mocha sobre answer.js. Así ejecutas todo con un simple npm test.

{
  "scripts": {
    "test": "mocha answer"
  }
}

¿Qué habilidades y keywords debes dominar?

Más allá de escribir código, aquí se mide tu capacidad para traducir requisitos a casos de prueba y configurar el entorno de ejecución.

  • Selección de framework: Tape, Mocha o Abba. Evitar Jest.
  • Aserciones sobre objects con deep equal.
  • Manejo de errores: throw y TypeError.
  • Validación de tipos: asegurar que el argumento sea string.
  • Configuración de package.json y uso de npm test.
  • Organización de pruebas: answer.js probando toTest.js con nombres de tests claros.

¿Tú con qué framework probarías este módulo y cómo nombrarías tus casos de prueba? Cuéntalo en los comentarios.