Javascript jest ReferenceError:无法访问'';初始化前

Javascript jest ReferenceError:无法访问'';初始化前,javascript,node.js,typescript,unit-testing,jestjs,Javascript,Node.js,Typescript,Unit Testing,Jestjs,我得到了一个错误: ReferenceError:无法在初始化之前访问“myMock” 尽管我尊重有关吊装的笑话文档: 我正在这样做: 从“/my_class”导入MyClass; 从“./另一个_类”导入*作为另一个类; const mockMethod1=jest.fn(); const mockMethod2=jest.fn(); 开玩笑('./我的班级',()=>{ 返回{ 默认值:{ staticMethod:jest.fn().mockReturnValue( { 方法1:模拟方法

我得到了一个错误:

ReferenceError:无法在初始化之前访问“myMock”

尽管我尊重有关吊装的笑话文档:

我正在这样做:

从“/my_class”导入MyClass;
从“./另一个_类”导入*作为另一个类;
const mockMethod1=jest.fn();
const mockMethod2=jest.fn();
开玩笑('./我的班级',()=>{
返回{
默认值:{
staticMethod:jest.fn().mockReturnValue(
{
方法1:模拟方法1,
方法2:模拟方法2,
})
}
}
});
正如您所看到的,我的两个变量都遵守“标准”,但没有正确提升

我错过什么了吗


显然,当我只传递
jest.fn()
而不是我的变量时,它就起作用了,但我不确定如何在以后的测试中使用这些变量。

文档解决的问题是
jest.mock
被挂起,但
const
声明没有被挂起。这导致在导入模拟模块时对工厂函数进行评估,并且变量处于暂时死区

如果需要访问嵌套的模拟函数,则需要将其作为导出对象的一部分公开:

jest.mock('./my_class', () => {
  const mockMethod1 = jest.fn();
  const mockMethod2 = jest.fn();
  return {
    __esModule: true,
    mockMethod1,
    mockMethod2,
    default: {
      ...

这也适用于
\uuuuu mocks\uuuu
中的手动模拟,其中变量只能在模拟内部访问。

当您需要监视
const
声明时,接受的答案不起作用,因为它是在模块工厂范围内定义的

对我来说,模块工厂需要高于任何导入语句,这些语句最终导入您想要模拟的内容。 下面是使用with库的代码片段

要澄清所说的内容,请将
常量移动到模块导入位置上方:

const mockMethod1 = jest.fn(); // Defined here before import.
const mockMethod2 = jest.fn();

import MyClass from './my_class'; // Imported here.
import * as anotherClass from './another_class';

jest.mock('./my_class', () => {
  return {
    default: {
      staticMethod: jest.fn().mockReturnValue(
        {
          method1: mockMethod1,
          method2: mockMethod2,
        })
    }
  }
});

mmmh但是文档中指出,以“mock”开头的变量有一个异常。真奇怪!我会试试你的解决方案谢谢!先生,你是救世主!它就像一个符咒!很高兴这有帮助。在处理变量的方式上没有异常,它只需要一个变量包含
mock
,以表明开发人员完全了解其后果。好吧,我想我误解了文档中所说的异常then@EstusFlask我肯定和苏菲安读的一样。看一看这里的例子:他们做的几乎和最初的询问者试图做的完全一样。实际上,这不是解决问题的正确方法。将任何内容置于导入之上并期望按照此顺序对其进行评估在技术上是错误的,因为ESM导入是通过规范提升的,而jest.mock是通过Babel转换由jest提升的,这也是指定的。它可能在一种设置中工作,但在另一种设置中失败,因为其行为尚未确定。在模拟中使用mockPrismaClient的正确方法是在
require
jest.requireActual
内部
jest.mock
中导入它,而不是依赖于父范围中的值。到目前为止,这种方法一直适用于各种设置。然而,我从来不知道是否有一种“技术上正确的方法”。介意和大家分享一下刚才解释的代码示例吗?我的意思是基本上是从“/utils/mockPrismaClient”导入mpc;mock('@prisma/client',()=>{const-mpc=require('./utils/mockPrismaClient')。默认值;返回{PrismaClient:jest.fn(()=>mpc)});
。因此,mock对实用程序模块的依赖是显式指定的,并且与潜在的竞争条件无关。如果需要,还允许将其提取到
\uu mocks\uuu
const mockMethod1 = jest.fn(); // Defined here before import.
const mockMethod2 = jest.fn();

import MyClass from './my_class'; // Imported here.
import * as anotherClass from './another_class';

jest.mock('./my_class', () => {
  return {
    default: {
      staticMethod: jest.fn().mockReturnValue(
        {
          method1: mockMethod1,
          method2: mockMethod2,
        })
    }
  }
});