Skip to content

Instantly share code, notes, and snippets.

@joaovictorino
Last active January 19, 2024 03:18
Show Gist options
  • Save joaovictorino/d4537368c8c4e54a26fad39efb0b6164 to your computer and use it in GitHub Desktop.
Save joaovictorino/d4537368c8c4e54a26fad39efb0b6164 to your computer and use it in GitHub Desktop.
Mockando o prisma

Mockando o prisma

Vamos remover o banco dos nossos testes de API, pois queremos apenas garantir que a API funciona.
Então vá até a pasta "web" e execute o comando abaixo para desligar o banco de dados

docker compose down

Agora volte execute o comando abaixo para adicionar uma dependência ao projeto "web"

npm install jest-mock-extended@3.0.5 -D

Agora dentro da pasta "__tests__" crie uma pasta "mock" e um arquivo "prisma.ts" com o código abaixo

import { PrismaClient } from '@prisma/client';
import { mockDeep, mockReset, DeepMockProxy } from 'jest-mock-extended';
import prisma from '../../prisma/prisma';

jest.mock('../../prisma/prisma', () => ({
	__esModule: true,
	default: mockDeep<PrismaClient>(),
}));

beforeEach(() => { 
	mockReset(prismaMock);
});

export const prismaMock = prisma as unknown as DeepMockProxy<{
	[K in keyof PrismaClient]: Omit<PrismaClient[K], "groupBy">;
}>;

Altere o arquivo "jest.config.js" do projeto "web" conforme abaixo

/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
  verbose: true,
  preset: 'ts-jest',
  testEnvironment: 'node',
  testMatch: ['<rootDir>/**/*.test.ts'],
  setupFilesAfterEnv: ["<rootDir>/__tests__/mock/prisma.ts"],
};

Por último, altere o teste "[numero].test.ts" conforme abaixo

import { createMocks } from "node-mocks-http";
import { Conta } from "@prisma/client";
import consultar from "../../../../pages/api/contas/[numero]";
import { prismaMock } from "../../../mock/prisma";

describe("API consulta de contas", () => {
    test("consulta com sucesso", async() => {
        const { req, res } = createMocks({
            method: "GET",
            url: "api/contas/",
            query: {
                numero: "123456",
            }
        });

        const conta: Conta = {
            numero: "123456",
            saldo: 100.0 
        };

        prismaMock.conta.findUnique.mockResolvedValue(conta);

        await consultar(req, res);
        expect(res.statusCode).toBe(200);
        expect(res._getJSONData()).toMatchObject(
            expect.objectContaining({
                numero: expect.any(String),
                saldo: expect.any(Number)
            })
        );
    });

    test("consulta sem registro", async() => {
        const { req, res } = createMocks({
            method: "GET",
            url: "api/contas/",
            query: {
                numero: "123456",
            }
        });

        prismaMock.conta.findUnique.mockResolvedValue(null);

        await consultar(req, res);
        expect(res.statusCode).toBe(404);
        expect(res._getJSONData()).toMatchObject(
            expect.objectContaining({
                mensagem: "conta nao encontrada"
            })
        );
    });
});

Agora rode os testes

npm run test

Os testes agora estão mais rápidos e com menor chance de apresentar erros.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment