【问题标题】:jest unexpected token when importing css导入css时开玩笑的意外令牌
【发布时间】:2019-07-04 17:44:11
【问题描述】:

我收到SyntaxError: Unexpected token . 的错误

在我的代码中

import 'react-dates/lib/css/_datepicker.css'
import 'semantic-ui-css/semantic.min.css'

那些不在我的 spec.js 中,而是在我的实现代码中,有什么线索吗?我运行我的应用程序没有问题,但是当我尝试运行测试时会抛出错误。

【问题讨论】:

  • 尝试不扩展。例如:导入'react-dates/lib/css/_datepicker.另请参阅stackoverflow.com/questions/49263429/… 可以解决您的问题
  • 不,如果我删除 .css,我得到了未解析的模块
  • 你在使用 babel-jest 吗?看起来您的依赖项中缺少 babel-jest。这就是为什么 jest 在执行测试之前没有在你的 ES6+ 代码上运行 babel。
  • @MebinJoe 我做到了。

标签: javascript jestjs


【解决方案1】:

问题在于 Jest 正在处理这些 CSS 导入并试图将它们解析为 JavaScript。

“意外令牌”。消息的出现可能是因为它阻塞的文件的第一行是 CSS 类声明,即.datepicker: { ... }

无论如何,正如this answer 中指出的那样,解决此问题的方法是创建一个包含导出空对象的模块的文件。我打电话给我的styleMock.js

module.exports = {};

然后,您需要在项目根目录中创建一个jest.config.js 文件并添加:

module.exports = {
  moduleNameMapper: {
    '\\.(css|less)$': '<rootDir>/test/jest/__mocks__/styleMock.js',
  }
};

moduleNameMapper 设置告诉 Jest 如何解释具有不同扩展名的文件。在这种情况下,我们只需将其指向我们刚刚创建的空文件。显然相应地调整文件的路径。

请注意,您可以将上面的正则表达式扩展为您需要的任何文件结尾。我的看起来像:

moduleNameMapper: {
  '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
    '<rootDir>/test/jest/__mocks__/fileMock.js',
  '\\.(css|less)$': '<rootDir>/test/jest/__mocks__/styleMock.js',
},

其中fileMock.jsstyleMock.js 相同

或者,您可以使用 jest-transform-stub 之类的模块,它为您做同样的事情。

【讨论】:

  • 惊人的答案!一旦我修复了文件路径以匹配我的项目并将(css|less) 更改为(css|less|scss),它对我有用。谢谢。
  • 我正在尝试这个,但我得到一个配置错误:找不到模块 react-datepicker/dist/react-datepicker.css 映射为:/home/alejo/tecnimaq/tecnilab/frontend/test/开玩笑/__mocks__/styleMock.js。请检查这些条目的配置: { "moduleNameMapper": { "/\.(css|less)$/": "/home/alejo/tecnimaq/tecnilab/frontend/test/jest/__mocks__/styleMock.js" } , "解析器": 未定义 }
  • 我回来了,再次感谢这个答案。对于 RedwoodJs,我发现这似乎是 @redwoodjs\testing\dist\fileMock.js 的重点。不幸的是它省略了scss。我的修复:const moduleNameMapper = { ...config.moduleNameMapper, '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css|scss|less)$': '@redwoodjs/testing/dist/fileMock.js' }; delete moduleNameMapper['\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css)$']; const configWithEditedModuleNameMapper = { ...config, moduleNameMapper: moduleNameMapper };
  • (该修复需要进入web\jest.config.js,然后需要以module.exports = configWithEditedModuleNameMapper;结束。)
  • 在我意识到 package.json 中的脚本指向外部 jest.config.js ala "test": "jest --config=./jest.config.js --silent", 之前,我用这个旋转了 20 分钟。将 moduleNameMapper 配置移动到该文件,然后它就可以工作了。
【解决方案2】:

Jest 不适用于导入 CSS 的 JSX。

我通过在 package.json 文件的 jest 配置中使用 moduleNameMapper 键解决了这个问题。

{
   "jest":{
        "moduleNameMapper":{
             "\\.(css|less|scss|sass)$": "identity-obj-proxy" 
        }
   }
}

但您需要安装 identity-obj-proxy 包作为开发依赖,即

yarn add identity-obj-proxy -D

【讨论】:

    【解决方案3】:

    对于在 2020 年秋季或之后遇到此问题的任何人,对于 Jest 解析 CSS 文件时出现类似 SyntaxError: Invalid or unexpected token 的错误:确实,该错误是由于 Jest 试图将 CSS 解析为 JavaScript,这是行不通的。因此,根据Jest documentation on handling static assets,处理此问题的更新方法是 3 个步骤,但除非您使用CSS Modules,否则您不需要像@chitra 建议的那样添加额外的包,如identity-obj-proxy。对比@james-hibbard 的建议:fileMock.js 现在看起来略有不同,您不需要创建jest.config.js

    1 在你的package.json 添加这个

    {
      "jest": {
        "moduleNameMapper": {
          "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
          "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
        }
      }
    }
    

    2 然后创建以下两个文件:

    // __mocks__/styleMock.js
    
    module.exports = {};
    

    3

    // __mocks__/fileMock.js
    
    module.exports = 'test-file-stub';
    

    当 Jest 像这样运行时,这应该可以解决这些特定错误

    SyntaxError: Invalid or unexpected token
    > 1 | import '../src/css/console.scss';
    

    【讨论】:

    • 嗨 Cat Perry,我收到错误消息:` 找不到模块 @reach/tabs/styles.css 映射为:./src/tests/mocks/styleMock.js。` 你有任何知道这里发生了什么吗?
    • 嗯不确定这个,抱歉
    • 经过数小时的调试并与 with-jest 示例存储库进行比较后,这是我的解决方案。此解决方案与 react-16.14 和 react-dom-16.14 一起使用,而 react-16.12 和 react-dom-16.12 上的示例 repo 在 next-10.0 上都成功地使用了旧解决方案。
    • 为 react@17.0.2 工作。谢谢!
    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多