Tests
Utilidad
Esta librería te permitirá hacer tests unitarios y de integración mucho más rápido
Instalación
Este store puedes instalarlo de la siguiente forma:
npm i --save-dev @codescouts/test
Dependencias
Unit tests
En caso de los unit tests, nuestra librería no modifica mucho el comportamiento original de jest-mock-extended simplemente la expone como una herramienta más.
Comienza por aquí
Vamos a hacer un test unitario de nuestro caso de uso continuando con el ejemplo del log.
El caso de uso
import { IEventDispatcher } from "@codescouts/events";
import { Log } from "@domain/model/Log";
import { NewLogRegistered } from "@domain/events/NewLogRegistered";
export class TestUseCase {
constructor(private readonly dispatcher: IEventDispatcher) {
}
public execute(message: string) {
const log = new Log(message);
this.dispatcher.dispatch(new NewLogRegistered(log));
}
}
Unit test
import { mock } from "@codescouts/test";
import { IEventDispatcher } from "@codescouts/events";
import { NewLogRegistered } from "@domain/events";
import { Log } from "@domain/model";
import { TestUseCase } from "./test-use-case";
jest
.useFakeTimers()
.setSystemTime(new Date('2020-01-01'));
describe("TestUseCase should", () => {
test("dispatch event with message log", () => {
const eventDispatcher = mock<IEventDispatcher>();
const useCase = new TestUseCase(eventDispatcher);
useCase.execute("Foo");
expect(eventDispatcher.dispatch).toHaveBeenCalledWith(new NewLogRegistered(new Log("Foo")));
})
})
Si necesitas saber más como funciona jest-mock-extended, consulta su documentación. En esta librería solo exponemos su funcionalidad.
Integration test
Para realizar tests de integración donde necesitemos verificar el llamado a servicios externos, podemos utilizar esta librería, nos permitirá verificar que nos comunicamos con el mundo exterior a traves del protocolo http permitiéndonos moquear nuestras peticiones.
Veamos como la usaríamos
import { setupServer } from "@codescouts/test/integration";
describe("SetupServer should", () => {
const server = setupServer();
test("Intercept get request", async () => {
const responseMocked = {
response: "GETTING Object"
};
server.mockGet("http://localhost:2000/test", 200, responseMocked);
const response = await fetch("http://localhost:2000/test");
const json = await response.json();
expect(response.status).toEqual(200)
expect(json).toEqual(responseMocked)
})
test("Intercept post request", async () => {
const responseMocked = {
response: "POSTING Object"
};
server.mockPost("http://localhost:2000/test", 200, responseMocked);
const response = await fetch("http://localhost:2000/test", {
method: "POST",
body: JSON.stringify({
"fake": "request"
})
});
const json = await response.json();
expect(json).toEqual(responseMocked)
})
test("Intercept put request", async () => {
const responseMocked = {
response: "PUTTING Object"
};
server.mockPut("http://localhost:2000/test/1", 200, responseMocked);
const response = await fetch("http://localhost:2000/test/1", {
method: "PUT",
body: JSON.stringify({
"fake": "request"
})
});
const json = await response.json();
expect(json).toEqual(responseMocked)
})
test("Intercept patch request", async () => {
const responseMocked = {
response: "PATCHING Object"
};
server.mockPatch("http://localhost:2000/test/1", 200, responseMocked);
const response = await fetch("http://localhost:2000/test/1", {
method: "PATCH",
body: JSON.stringify({
"fake": "request"
})
});
const json = await response.json();
expect(json).toEqual(responseMocked)
})
test("Intercept Delete request", async () => {
const responseMocked = {
response: "DELETING Object"
};
server.mockDelete("http://localhost:2000/test/1", 200, responseMocked);
const response = await fetch("http://localhost:2000/test/1", {
method: "DELETE"
});
const json = await response.json();
expect(json).toEqual(responseMocked)
})
})
Esta librería controla el ciclo de vida de los tests con jest, definiendo por defecto el beforeEach, afterEach, y afterAll