Jest 不会在 NextJS 应用程序中解析 SVG 图片

Posted

技术标签:

【中文标题】Jest 不会在 NextJS 应用程序中解析 SVG 图片【英文标题】:Jest won't parse SVG pictures in NextJS application 【发布时间】:2021-11-28 14:32:10 【问题描述】:

当我运行 yarn test 时,我收到以下消息:

 Jest encountered an unexpected token

This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain javascript.

By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

Here's what you can do:
 • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/en/ecmascript-modules for how to enable it.
 • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
 • If you need a custom transformation specify a "transform" option in your config.
 • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html

Details:

/home/marouane/projects/manage-landing-page/jest.setup.ts:1
("Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest)import "@testing-library/jest-dom/extend-expect";
                                                                                         ^^^^^^

SyntaxError: Cannot use import statement outside a module

  at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1350:14)

我在网上看了下,发现必须要安装jest-svg-transformer,我照做了。

我还在jest.config.js 文件中添加了所需的行:

module.exports = 
  setupFilesAfterEnv: ["<rootDir>/jest.setup.ts"],
  transform: 
    '^.+\\.jsx?$': 'babel-jest',
    '^.+\\.svg$': 'jest-svg-transformer',
  ,

;

它仍然不起作用。我尝试了网络上的所有其他解决方案,但无济于事。

任何帮助将不胜感激!谢谢!

编辑:

显然,我应该在jest.config.js 文件中输入tsx 而不是jsx,仅此而已...愚蠢的错误,我知道...哦,好吧!!!

【问题讨论】:

【参考方案1】:

我遇到了这个问题。我认为你应该内联你的文件。在jest.config 中,我检查.svg 并将其替换为内联字符串。

// jest.config.js
module.export = 
  transform: 
    '^.+\\.[tj]sx?$': 'babel-jest',
    '^.+\\.svg$': '<rootDir>/svgTransformer.js',
  

// svgTransformer.js
module.exports = 
  process(src, filename) 
    const assetFilename = JSON.stringify(path.basename(filename));

    if (filename.match(/\.svg$/)) 
      // Based on how SVGR generates a component name:
      // https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
      const pascalCaseFilename = pascalCase(path.parse(filename).name);
      const componentName = `Svg$pascalCaseFilename`;
      return `const React = require('react');
      module.exports = 
        __esModule: true,
        default: $assetFilename,
        ReactComponent: React.forwardRef(function $componentName(props, ref) 
          return 
            $$typeof: Symbol.for('react.element'),
            type: 'svg',
            ref: ref,
            key: null,
            props: Object.assign(, props, 
              children: $assetFilename
            )
          ;
        ),
      ;`;
    

    return `module.exports = $assetFilename;`;
  ,
;
// pascal-case.ts
import  camelCase, toUpper  from 'lodash';

export const pascalCase = (str: string) => camelCase(str).replace(/^(.)/, toUpper);

如果您有任何问题,请告诉我。

【讨论】:

感谢您的帮助。即使这不是解决方案(我找到了它,而且它来自我的一个非常愚蠢的错误,没有任何借口)。 这对我不起作用,你有这个的 github 吗?谢谢

以上是关于Jest 不会在 NextJS 应用程序中解析 SVG 图片的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NextJS API 在 Jest 单元测试中考虑 Google reCaptcha

NextJS Router & Jest:如何模拟路由器更改事件

用 Jest 测试 NextJS API 中间件

将 React/Enzyme/Jest 与 Nextjs 一起使用时是不是可以获得整页 html?

让 Nextjs 忽略 babel.config.js

Apollo 中 NextJs s-s-r 和 cookie 的问题