Jest test suite failed to run because of "TypeError: Cannot read property 'xxx' of undefined"

Jest test suite failed to run because of "TypeError: Cannot read property 'xxx' of undefined"

我正在尝试重新组织我的 TypeScript React 项目的 import/export 语句,使它们更短更清晰,基本上是通过在每个功能特定文件夹中定义一个 index.ts 文件来导出资源的方法(interface/type/function 等)该功能。这Smarter way to organize "imports" blog解释了几乎相同的想法。

但是在更改后,笑话执行突然中断,堆栈跟踪如下。出于保密目的,涉及的实体已被欺骗。

Test suite failed to run

    TypeError: Cannot read property 'FooBarEnum' of undefined



      at Object.FooBarEnum (src/features/Zoo/index.ts:93:23)
      at Object.<anonymous> (src/features/CarPark/CarParkManager.ts:18:4)
      at Object.<anonymous> (src/features/CarPark/index.ts:1:1)
      at Object.<anonymous> (src/features/Zoo/ZooManager.ts:1:1)
      at Object.<anonymous> (src/features/Zoo/index.ts:14:1)
      at Object.<anonymous> (src/features/Rabbit/Rabbit.ts:4:1)
      at Object.<anonymous> (test/features/Rabbit/Rabbit.test.ts:2:1)

基本上是在常量文件中定义了一个枚举,根本无法读取。

我很确定我的玩笑设置是正确的,因为它在此之前已成功执行。我使用babel-jest@babel/preset-typescript来编译。

如果有人能指出调试路径,我将不胜感激,因为堆栈跟踪并不能说明什么。

最后我意识到这是由我的代码库中隐藏的循环依赖引起的。

[TL;DR] 依赖循环:Rabbit > Zoo index > CarPark index > Zoo index.

[详情]情况是ZooManager是从Zoo文件夹的索引文件中导出的,ZooManager是从索引文件中导出的CarParkManager导入的CarPark 个文件夹。 'FooBarEnum'从Zoo文件夹的索引文件导出,供CarParkManager使用,构成依赖循环

我知道给定的欺骗示例不太好读,但这提供了一个提示,当您遇到类似问题时,请注意循环依赖。

可以添加import/no-cycleESLint规则来进行静态检查。

并且madge开发者工具可以用来构建一个可视化的模块依赖图。

参考文献: