Saltar al contenido principal

GUI-DGT-008 Guía de pruebas unitarias en TypeScript

v 1.0

Objetivo

Esta guía busca enseñar a los desarrolladores a escribir pruebas unitarias en TypeScript para garantizar la calidad del código.

Notas introductorias

  • TypeScript es un lenguaje de programación que añade tipado estático a JavaScript.
  • Las pruebas unitarias son pruebas que se realizan a las funciones o métodos de una clase para garantizar que su comportamiento es el esperado.
  • Para realizar pruebas unitarias en TypeScript, se utiliza la librería Mocha & Chai.
  • Para realizar mocks en TypeScript, se utiliza la librería Sinon.
  • Faker es una librería que permite generar datos aleatorios para pruebas.

Procedimiento

Crear un archivo de pruebas

  1. Describe: define un grupo de pruebas relacionadas. Se utiliza para agrupar pruebas que tengan un contexto común.
  2. BeforeEach: se ejecuta antes de cada prueba dentro de un describe. Se utiliza para preparar el estado inicial necesario para cada prueba.
  3. AfterEach: se ejecuta después de cada prueba dentro de un describe. Se utiliza para limpiar el estado después de cada prueba.
  4. It: define una prueba individual para una funcionalidad en específico. Contiene las afirmaciones que se deben cumplir para que la prueba sea exitosa.
  5. Expect: función de Chai que se utiliza para realizar afirmaciones sobre el resultado esperado de una operación.
  6. Stub: función de Sinon que se utiliza para simular el comportamiento de una función o método.

Ejemplo

import { expect } from "chai";
import { faker } from "@faker-js/faker";
import sinon, { SinonSandbox, SinonStubbedInstance } from "sinon";
import { randomUUID } from "crypto";

import { EntityService } from "../entity.service";
import { EntityRepository } from "../../../infra/repository/entity.repository";

describe("EntityService", () => {
let entityFunctionStub: sinon.SinonStub;

beforeEach(() => {
entityFunctionStub = sinon.stub(EntityRepository, "entityFunction");
});

afterEach(() => {
sinon.restore();
});

describe("Task Service Method", () => {
it("First test case", async () => {
const object = {
id: randomUUID(),
name: faker.person.firstName() + " " + faker.person.lastName(),
age: faker.number.int({ min: 18, max: 65 }),
email: faker.internet.email(),
};

entityFunctionStub.resolves(object);

const result = await EntityService.entityFunction();

expect(result).to.be.an("object");
expect(result).to.have.property("id").to.be.a("string");
expect(result).to.have.property("name").to.be.a("string");
expect(result).to.have.property("age").to.be.a("number");
expect(result).to.have.property("email").to.be.a("string");

sinon.assert.calledOnce(entityFunctionStub);
sinon.assert.calledWithExactly(entityFunctionStub);
});
});

describe("Another Task Service Method", () => {
it("First test case", async () => {
entityFunctionStub.resolves(faker.random.word());

const result = await EntityService.entityFunction();

expect(result).to.be.a("string");
expect(result).to.have.lengthOf.above(0);

sinon.assert.calledOnce(entityFunctionStub);
sinon.assert.calledWithExactly(entityFunctionStub);
});
});

describe("Another Task Service Method", () => {
it("First test case", async () => {
entityFunctionStub.resolves(faker.random.word());

const result = await EntityService.entityFunction();

expect(result).to.be.a("string");
expect(result).to.have.lengthOf.above(0);

sinon.assert.calledOnce(entityFunctionStub);
sinon.assert.calledWithExactly(entityFunctionStub);
});
});
});

Control de Cabmios

VersiónCambio realizadoAnálisisAutorRevisor(es)Fecha de cambio
v 1.0Creación de la guíaSe creó la guía para enseñar a los desarrolladores a escribir pruebas unitarias en TypeScriptCarlos SalgueroSergio Garnica04/05/2024