在Jest测试中使用命名的导入内容导入“ constants”

时间:2018-06-19 16:36:13

标签: testing jestjs jsdom

我的项目中有一个configconstants文件夹。分别位于src\config\test.tssrc\constants\index.js中。

我将Jest设置为使用moduleNameMapper如下,因此我可以只进行import config from 'config'import { SOME_CONST } from 'constants'

"moduleNameMapper": {
  "config$": "<rootDir>/src/config/test.js",
  "constants$": "<rootDir>/src/constants/index.js"
}

但是,在我的测试中,使用import { SOME_CONST } from 'constants'的任何文件始终会为undefined获得SOME_CONST的值,而我们默认从config导出的文件都可以正常工作。

这是一个已知问题吗?我在这里做错什么了吗?似乎无法将其固定下来。

2 个答案:

答案 0 :(得分:0)

我遇到了与您相同的问题,但最终找到了解决这个问题的github issue。看来constants是核心模块,因此在进行jest的模块映射之前先进行评估。我发现this comment对我有用,并说要把它放在您的测试文件中:

jest.mock('constants', () => require('path/to/your/constants'))

一种替代方法是执行上面his comment中@dougajmcdonald所建议的操作,并将您的Webpack别名从constants重命名为其他名称,例如app-constants

答案 1 :(得分:0)

  

我也遇到了同样的挑战:用jest设置babel-6

以前,我在create-react-app(CRA)方法方面做了很多工作。当我遇到这个挑战时,我深深地开始真正欣赏facebook team在提出CRA工具方面所做的出色工作。

无论如何,这就是我如何应对这一挑战的方式。 首先,我们需要保持记录整齐。

  
      
  • 接受这些现代JavaScript工具的配置很麻烦,因此请耐心
  •   
  • Jest 24放弃了对 babel-6 的支持(这是我的全部挑战,升级到babel-7还会带来许多其他我想避免的更改)
  •   
  • 关于配置jestbabel-7一起使用的文档非常多,而与babel-6兼容却很少。
  •   

好的,让我们开始吧:

  1. 我已根据official jest docs (24.9)的建议更新了密钥dependencies以便与babel-6一起使用。并且undefined在运行测试时仍然存在错误。
"dependencies": {
  "babel-core": "^6.26.3",
  "babel-jest": "^23.6.0",
  "babel-preset-env": "^1.7.0",
  "jest": "^24.0.0"
}
  1. 我继续// comment out行以确认我是否可以采取补救措施,但是可惜我从玩笑中得到了更详细的error信息(至少,这是很好的解释,谢谢大家)。
  

屏幕截图1 :已注释掉import * as C from ...声明

Troubleshooting jest/babel errors

  

屏幕截图2 :尽管注释了jest常量语句,但来自import的错误消息。

Detailed error message from jest

  1. 最后,这可行,在经过大量的“搜索”和反复试验之后,我终于偶然发现了一种有效的依赖关系组合。好吧,鉴于我一直在更改它们,因此我决定将它们另存为--devDependenciesset-up babel-jest作为我的.js代码的转换器,并更新了.babelrc babel配置文件。
// package.json

  "devDependencies": {
    "babel-core": "6.26.0",
    "babel-jest": "21.2.0",
    "babel-loader": "7.1.2",
    "babel-preset-env": "1.6.0",
    "babel-preset-react": "6.24.1",
    "babel-preset-stage-0": "6.24.1",
    "jest": "21.2.1",
    "webpack": "3.6.0"
  },
  "jest": {
    "transform": {
      "^.+\\.jsx?$": "babel-jest"
    }
  }

// .babelrc

{
  "presets": [
    "env",
    "stage-0",
    "react"
  ]
}