typescript - خطای مرجع: نمیتوان به 'jest_mock_extended_1' قبل از مقداردهی اولیه دسترسی پیدا کرد
من کد زیر را دارم.
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;
من دارم راهنمای prisma برای تست واحد را دنبال میکنم اینجا: https://www.prisma.io/docs/guides/testing/unit-testing. نمیدانم چرا مدام این خطا را دریافت میکنم:
این پیام خطا است ReferenceError: نمیتوان به 'jest_mock_extended_1' قبل از مقداردهی اولیه دسترسی پیدا کرد
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)
پاسخ شماره ۱
به نظر عجیب میرسید که کلاسی را که در حال شبیهسازی آن هستید فقط برای صادر کردن، وارد کنید. بنابراین من deepMock از PrismaClient ایجاد کردم، آن را به jest.mock اضافه کردم و deepMock را صادر کردم.
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 }
پاسخ شماره ۲
مشکل این است که مسیر واردات و مسیری که شما شبیهسازی میکنید یکسان هستند. یعنی import prisma from "../prismaClient"; توسط شبیهساز گرفته میشود
jest.mock("../prismaClient", () => ({
__esModule: true,
default: mockDeep<PrismaClient>(),
}));
پس این به این معنی است که در خود فایل، شبیهسازی اتفاق میافتد که باعث آن خطا میشود. اگر میخواهید این کار انجام شود، مسیرهایی که شبیهسازی میکنید و مسیری که اینجا وارد میکنید باید متفاوت باشند. چیزی شبیه به مثال زیر کار میکند
import prisma from "../prismaClient";
jest.mock("../../prismaClient", () => ({
__esModule: true,
default: mockDeep<PrismaClient>(),
}));
