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
- Describe: define un grupo de pruebas relacionadas. Se utiliza para agrupar pruebas que tengan un contexto común.
- BeforeEach: se ejecuta antes de cada prueba dentro de un
describe
. Se utiliza para preparar el estado inicial necesario para cada prueba. - AfterEach: se ejecuta después de cada prueba dentro de un
describe
. Se utiliza para limpiar el estado después de cada prueba. - It: define una prueba individual para una funcionalidad en específico. Contiene las afirmaciones que se deben cumplir para que la prueba sea exitosa.
- Expect: función de Chai que se utiliza para realizar afirmaciones sobre el resultado esperado de una operación.
- 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ón | Cambio realizado | Análisis | Autor | Revisor(es) | Fecha de cambio |
---|---|---|---|---|---|
v 1.0 | Creación de la guía | Se creó la guía para enseñar a los desarrolladores a escribir pruebas unitarias en TypeScript | Carlos Salguero | Sergio Garnica | 04/05/2024 |