Jest 测试套件因“TypeError:无法读取未定义的属性‘xxx’”而无法运行

Rui*_* Ma 4 typescript jestjs es6-module-loader

我正在尝试重新组织 TypeScript React 项目的导入/导出语句,使它们更短、更清晰,基本上是通过index.ts在每个功能特定文件夹中定义文件来导出该功能的资源(接口/类型/功能等)的方法。这种组织“进口”博客的更智能方式解释了几乎相同的想法。

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

如果有人能给我指出调试路径,我将不胜感激,因为堆栈跟踪并不能真正说明太多信息。

Rui*_* Ma 7

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

[TL;DR] 依赖循环:Rabbit>Zoo索引>CarPark索引>Zoo索引。

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

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

可以添加import /no-cycle ESLint 规则来执行静态检查。

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

参考: