在 Jest 测试运行期间,一个模块的所有导入均未定义

问题描述 投票:0回答:5

Jest、create-react-app 和 typescript 的奇怪错误。

今晚 Jest 开始无法正确导入我的“./ProcessStore”模块。这个模块是我的测试导入的东西的传递依赖。

我看到的错误是我导入的东西未定义。

当我执行

import * as what from "./ProcessStore"
和 log(what) 时,它会打印所有导出,但值未定义。就像
{default: undefined, ResourceChange: undefined}
导出的两个类一样。应该是
{default: <a class>, ResourceChange: <a class>}

这只是一个文件。所有其他文件都有效。

当我使用 npm start 时,它可以工作 --- 这只是一个 Jest 问题。

此外,如果我将损坏的文件重命名为

./ProcessStore2
,它也可以工作。

我尝试过

./node_modules/jest --clearCache
,但没有帮助。

如果相关的话,我通常使用craco。暂时切换回反应脚本并没有帮助。

我正在使用react-scripts 4.0.3(最新版本)。

发生什么事了?我该如何解决这个愚蠢的问题?

reactjs typescript jestjs create-react-app
5个回答
18
投票

这是由我的项目中的循环依赖引起的。

循环依赖导致 Jest 返回一个空模块。我相信第二次进入模块时,它会有未定义的内容。

就我而言,链条是

ProcessStore.ts -> stores.ts -> ProcessStore.ts
。因此,当
stores.ts
加载
ProcessStore.ts
时,流程存储已经加载,因此一切都未定义。


3
投票

当我导入这样的一个文件时,我遇到了这个问题

import { myHook } from 'services/hooks/myHook'

在另一个文件中

import { myHook } from 'services/hooks'

有一个索引文件

// src/services/hooks/index.ts
export * from './myHook.ts'

将它们全部转换为使用索引路径修复了它。我不认为我在任何地方都有循环依赖,我永远无法真正理解出了什么问题。


3
投票

由于循环依赖,我也遇到了这个问题。

为了确认错误的性质,我

console.log
缺少导入并执行了我的测试。我可以看到实际上是
undefined
导入了不应该导入的内容。

我运行此命令来查找包/项目级别的循环依赖项:

npx madge --circular --extensions ts,tsx .

然而,这只给了我一个关于发生了什么的线索。

然后我在循环依赖发生的地方使用了

debugger
。使用 Chrome DevTools,我检查了调用堆栈,并发现了每个导入的导入方式。这非常清楚地揭示了循环依赖。对我来说,这是解决循环依赖的最重要部分。


0
投票

我遇到过这样的情况:我没有循环依赖项,但导入仍然是

undefined
在一个小型 monorepo 的库中。听起来很奇怪,但使用较短的文件名解决了问题。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.