Fala Carlos Vinicius! Muito massa seu post! Na mesma pegada de desenvolvimento testável e escrevendo uma arquitetura desacoplada, publiquei esse artigo sobre a utilização de um ORM no contexto testável e independente.
No meu desenvolvimento guiado por testes, gosto muito de utilizar o factory pattern para o gerenciamento de entradas da minha função/classe. EX:
Nesse mesmo contexto de teste de uma classe controller, gosto de configurar meu teste da seguinte maneira:
import { CreateUserController } from "./controller";
const makeHttpRequest = (props?: Partial<HttpRequest>): HttpRequest => ({
name: "any_name",
email: "any_email",
password: "any_password",
...props,
});
test("it should return 400 if no name is provided", async () => {
const createUserController = new CreateUserController();
const request = makeHttpRequest({ name: undefined });
const response = await createUserController.handle(request);
expect(response).toEqual({
statusCode: 400,
body: new Error("send all required fields"),
});
test("it should return 200 valid data is provided", async () => {
const createUserController = new CreateUserController();
const request = makeHttpRequest();
const response = await createUserController.handle(request);
expect(response).toEqual({
statusCode: 200,
body: "ok",
});
});
});
No exemplo acima, a função makeHttpRequest
monta a minha requisição com todos os parâmetros válidos, e se eu quiser sobrescrever algum parâmetro, eu passo na chamada da função, como estou fazendo no primeiro teste. Isso me ajuda a manter o teste mais legível e com menos repetições.
Da mesma maneira, no segundo teste, eu não preciso passar nenhum parâmetro, pois a função makeHttpRequest
já monta a requisição com todos os parâmetros válidos.
Espero que ajude! Abraço!