TS-JEST не удается запустить тестовый файл TSX из-за «Импорт» из файла JS модуля - PullRequest
2 голосов
/ 14 октября 2019

Я пытаюсь использовать ts-jest для запуска файла теста tsx form.spec.tsx.

Редактор form.spec.tsx импортирует React Quill и некоторые плагины.

Как обойти ошибку SyntaxError: Unexpected identifier, исходящую от плагина под названием quill-упоминание , которыйимпорт Quill? Этот модуль участвует в form.spec.tsx.

Я добавил ["<rootDir>/node_modules/"] в поле transformIgnorePatterns в конфигурации jest, но эта проблема все еще существует из / node_modules / quill-упоминания / src / quill.mention.js

  ● Test suite failed to run

    /home/web/node_modules/quill-mention/src/quill.mention.js:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Quill from 'quill';
                                                                                                    ^^^^^

    SyntaxError: Unexpected identifier

      1 | import React from "react"
    > 2 | import "quill-mention";
        | ^

form.spec.tsx:

import {render, RenderResult, waitForElement} from "react-testing-library";
import ReactQuill, {Quill} from 'react-quill';
import "quill-mention";

const renderResult = render(
        <ReactQuill
            modules={
             {
                mention: {
                   allowedChars: /^[A-Za-z\sÅÄÖåäö]*$/,
                   mentionDenotationChars: ["@", "#"],
                },
            }
        />
);

package.json

  "jest": {
    "transform": {
      "^.+\\.tsx?$": "ts-jest"
    },
    "globals": {
      "ts-jest": {
        "tsConfig": "tsconfig.jest.json"
      },
      "window": {}
    },
    "testRegex": "(/watch/web/__tests__/.*|(\\.|/)(test|spec))\\.(jsxxxx?|tsx?)$",
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js",
      "jsx",
      "json",
      "node"
    ],
    "modulePaths": [
      "<rootDir>"
    ],
    "moduleNameMapper": {
      ".+\\.(css|styl|less|sass|scss)$": "identity-obj-proxy",
      ".+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/FileMock.js"
    },
    "transformIgnorePatterns": [
      "<rootDir>/node_modules/"
    ]
  }

tsconfig.jest.json:

{
  "compilerOptions": {
    "jsx": "react",
    "module": "commonjs",
    "target": "es6",
    "moduleResolution": "node",
    "removeComments": true,
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": false,
    "experimentalDecorators": true,
    "noLib": false,
    "declaration": false,
    "emitDecoratorMetadata": true,
    "lib": ["es6", "dom"],
    "types": ["jest","reflect-metadata"],
    "inlineSources":true,
    "skipLibCheck": true,
    "esModuleInterop": true
  },
  "exclude": [
    "node_modules"
  ]
}

Кто-то говорит allowJs: true может это исправить, но это не работает. Все мои тесты не прошли, сказав JavaScript heap out of memory.

1 Ответ

5 голосов
/ 27 октября 2019

Проблема в том, что Jest не преобразует этот файл. И в простом JS, import недействительно. Вам необходимо настроить Jest так, чтобы он преобразовывал этот файл.

Сначала измените transform, чтобы он также обрабатывал файлы с расширениями js или jsx (в дополнение к ts files:)

"jest": {
  "transform": {
    "^.+\\.(ts|js)x?$": "ts-jest"
  },

Далее вам нужно внести каталог в белый список, чтобы Jest преобразовал его. Это пропускает преобразование всех файлов в node_modules , за исключением в quill-mention dir.

    "transformIgnorePatterns": [
      "<rootDir>/node_modules/(?!(quill-mention)/)"
    ]

Это должно решить проблемы с quill-mention. И теперь он должен потерпеть неудачу с ReferenceError: MutationObserver is not defined, что является другой проблемой, связанной со средой Jest JSDom, которую он использует. О том, как это исправить, вы можете прочитать здесь:

Тестирование MutationObserver с помощью Jest

Вы также можете рассмотреть возможность перехода на babel-jest + @babel/preset-typescript вместо использованияts-jest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...