typescript - ReferenceError: Kan ikke få tilgang til 'jest_mock_extended_1' før initialisering


Jeg har følgende kode.

singleton.ts

import prisma from "../prismaClient";
import { mockDeep, mockReset } from "jest-mock-extended";
import { PrismaClient } from "@prisma/client";
import { DeepMockProxy } from "jest-mock-extended/lib/cjs/Mock";

jest.mock("../prismaClient", () => ({
  __esModule: true,

  default: mockDeep<PrismaClient>(),
}));

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

export const prismaMock = prisma as unknown as DeepMockProxy<PrismaClient>;

prismaKlient.ts

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient({
  log: [
    {
      emit: "event",
      level: "query",
    },
    {
      emit: "stdout",
      level: "error",
    },
    {
      emit: "stdout",
      level: "info",
    },
    {
      emit: "stdout",
      level: "warn",
    },
  ],
});

export default prisma;

Jeg følger Prismas guide til enhetstesting her: https://www.prisma.io/docs/guides/testing/unit-testing. Jeg vet ikke hvorfor jeg stadig får denne feilen:

Dette er feilmeldingen ReferenceError: Kan ikke få tilgang til 'jest_mock_extended_1' før initialisering

       7 |   __esModule: true,
       8 |
    >  9 |   default: mockDeep<PrismaClient>(),
         |            ^
      10 | }));
      11 |
      12 | beforeEach(() => {

      at src/utils/testUtils/singleton.ts:9:12
      at Object.<anonymous> (src/utils/testUtils/singleton.ts:1:1)
      at Object.<anonymous> (src/resolvers/functions/user.test.ts:1:1)

Svar #1

Det virket rart å importere en klasse som du mocker bare for å eksportere den. Så jeg laget en deepMock av PrismaClient, la den til i jest.mock og eksporterte deepMocken.

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

const prismaMock = mockDeep<PrismaClient>();

jest.mock("../prismaClient", () => ({
  __esModule: true,
  default: prismaMock
}));

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

export { prismaMock }

Svar #2

Problemet er at importstien og stien du mocker er den samme. Det vil si import prisma from "../prismaClient"; blir mocket av

jest.mock("../prismaClient", () => ({
  __esModule: true,

  default: mockDeep<PrismaClient>(),
}));

Så dette betyr at i selve filen skjer det mocking som utløser den feilen. Hvis du vil at dette skal fungere, må stien du mocker og stien du importerer her være forskjellige. Noe som det nedenfor fungerer

import prisma from "../prismaClient";

jest.mock("../../prismaClient", () => ({
  __esModule: true,

  default: mockDeep<PrismaClient>(),
}));

Relaterte artikler