【问题标题】:Jest test suite failed to run because of "TypeError: Cannot read property 'xxx' of undefined"由于“TypeError:无法读取未定义的属性 'xxx'”,Jest 测试套件无法运行
【发布时间】:2020-12-08 08:15:30
【问题描述】:

我正在尝试重新组织我的 TypeScript React 项目的导入/导出语句,以使它们更短更清晰,基本上是通过在每个功能特定文件夹中定义 index.ts 文件来导出资源(接口/类型/功能等)的该功能。这个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)

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

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

如果有人可以指出我的调试路径,因为堆栈跟踪并没有真正说明太多,因此不胜感激。

【问题讨论】:

    标签: typescript jestjs es6-module-loader


    【解决方案1】:

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

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

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

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

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

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

    参考资料:

    【讨论】:

    • 你能分享一下实现的细节吗?我遇到了完全相同的问题,但我不确定如何解决?
    • 我无法提供代码实现细节,但链接的工具在检测循环依赖方面非常有用。尝试摆脱这种循环依赖,看看你的问题是否得到解决。
    猜你喜欢
    • 2017-08-13
    • 2018-06-14
    • 1970-01-01
    • 2017-09-19
    • 2017-07-30
    • 2020-01-08
    • 2019-02-05
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多