【问题标题】:Jest: TypeError: Cannot read property of undefined笑话:TypeError:无法读取未定义的属性
【发布时间】:2018-10-29 19:58:27
【问题描述】:

我正在尝试测试我的 React 类,它具有 import dotnetify from "dotnetify"; 导入。这很好用,但 Jest 说,dotnetify 是未定义的。如果我更改为const dotnetify = require("dotnetify");,Jest 通过了测试,但这是一种愚蠢的解决方法。怎么解释 Jest,那个 dotnetify 不是 undefined?

比你提前。

【问题讨论】:

    标签: reactjs typescript unit-testing ecmascript-6 jestjs


    【解决方案1】:

    这不能向 Jest '解释',它真的是未定义的。

    在 TypeScript 中有几种处理 CommonJS 模块的方法。正如this answer 中所述,只有在使用esModuleInterop (allowSyntheticDefaultImports) 编译器选项启用合成导入时,CommonJS 包中才会有默认导入。

    否则应该这样做:

    import * as dotnetify from "dotnetify";
    

    或者使用特定于 TypeScript 的语法:

    import dotnetify = require("dotnetify")
    

    【讨论】:

    • import * as dotnetify from "dotnetify" 对我来说是最好的方法。谢谢!
    • 不客气。其他两个被认为更具前瞻性,但我想在这种特殊情况下这没什么大不了的。
    • 我还能尝试什么?我同时启用了 esModuleInterop 和 allowSyntheticDefaultImports,并且我收到来自 typescript 模块而不是 CommonJS 的错误。我的导出非常简单,例如export let config: AppConfig;,然后是config = {...},然后是文件结尾export default config;。然后导入另一个文件import config from '@/services/config.service'; 开玩笑地失败,在应用程序中工作就像一个魅力。 const config = require('@/services/config.service'); 修复了问题,但我不喜欢在我的现代 2020 打字稿项目中使用:D
    • @Luckylooke 究竟是什么错误?如果您尝试过import config from '@/services/config.service',您是否尝试将默认导入替换为* as config,正如答案所暗示的那样? import..require 是特定于 TS 的语法,为 require 提供类型安全。您将需要 require 在 Jest 中以任何方式进行模块模拟。
    • @Luckylooke 问题和答案特定于第三方 CommonJS 节点包,例如点网化。你自己的 ES 模块 有问题意味着 Jest+Babel+TS 设置在某些时候出错了。我建议提出一个新问题,以显示您的设置并解释问题。
    猜你喜欢
    • 2021-10-29
    • 2021-10-26
    • 2022-06-28
    • 2019-06-10
    • 2017-06-27
    • 2020-11-19
    • 2018-06-17
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多