Website-Suche

typescript - ReferenceError: Kann nicht auf 'jest_mock_extended_1' vor der Initialisierung zugreifen


Ich habe den folgenden Code.

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>;

prismaClient.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;

Ich folge hier dem Prisma-Leitfaden zum Unit-Testing: https://www.prisma.io/docs/guides/testing/unit-testing. Ich weiß nicht, warum ich diesen Fehler immer wieder bekomme:

Dies ist die Fehlermeldung ReferenceError: Kann 'jest_mock_extended_1' vor der Initialisierung nicht zugreifen

       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)

Antwort #1

Es schien seltsam, eine Klasse zu importieren, die man gerade mockt, nur um sie zu exportieren. Also habe ich ein deepMock von PrismaClient erstellt, es dem jest.mock hinzugefügt und das deepMock exportiert.

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 }

Antwort #2

Das Problem ist, dass der Importpfad und der Pfad, den Sie mocken, derselbe sind. Das heißt, import prisma from "../prismaClient"; wird gemockt von

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

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

Das bedeutet also, dass im Datei selbst ein Mocking erfolgt, das diesen Fehler auslöst. Wenn Sie möchten, dass dies funktioniert, müssen der Pfad, den Sie mocken, und der Pfad, den Sie hier importieren, unterschiedlich sein. Etwas wie das Folgende funktioniert.

import prisma from "../prismaClient";

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

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

Verwandte Artikel