babel @7 и настройка jest

Может быть, вы можете мне помочь? Я пытаюсь настроить шутки для использования babel @7 Итак, у меня есть:

"jest": "^23.4.1",
"@babel/core": "^7.0.0-beta.54",
"babel-7-jest": "^21.3.3",
"babel-jest": "^20.0.3",

И jest config внутри package.json

"jest": {
    "transform": {
      "^.+\\.js$": "babel-7-jest",
    },

И получил

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string

Но если я использую

"jest": {
    "transform": {
      "^.+\\.js$": "babel-jest",
    },

я получил

Requires Babel "^7.0.0-0", but was loaded with "6.26.3". If you are sure you have a compatible version of @babel/core, it is likely that something in your build process is loading the wrong version. Inspect the stack trace of this error to look for the first entry that doesn't mention "@babel/core" or "babel-core" to see what is calling Babel.

babel config: https://gist.github.com/SilentImp/1506e9c26d16d9839a4469c6f3ae5c4d

Может, у вас есть идеи?

Ответ 1

Я считаю, что нашел рабочее решение (не благодаря команде Jest, которая предоставила неверную документацию и уклонилась от проблем GitHub по этой проблеме).

В разделе devDependencies вашего devDependencies package.json вам нужно следующее:

  "devDependencies": {
    "@babel/core": "^7.0.0-beta.54",
    "@babel/preset-env": "^7.0.0-beta.54",
    "babel-core": "^7.0.0-bridge.0",
    "babel-jest": "^23.4.0",
    "bili": "^3.1.2",
    "jest": "^23.4.1",
    "regenerator-runtime": "^0.12.0"
  }

В вашем .babelrc:

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "debug": false,
                "targets": {
                    "browsers": [
                        "last 3 versions"
                    ]
                }
            }
        ]
    ]
}

В моем конкретном проекте мне не нужно было использовать конфигурацию Jest, поэтому я удалил пустой файл jest.config.js.

Ключевые моменты:

  • Удалите babel-7-jest поскольку это устарело, так как теперь есть официальная поддержка.
  • Обязательно используйте только пакеты @babel/xyz идущие вперёд. Мост babel-core который я установил, является "официальным" способом использования последнего Babel 7. Я предполагаю, что эта потребность будет удалена в какой-то момент в будущем, поскольку все мигрирует к Вавилону 7.
  • Теперь вы можете использовать функции ES6+, включая import/export и больше не нуждаетесь в устаревшем require().

Редактировать:

Если вы хотите иметь более подробный журнал тестов прохождения/сбоя, поместите это в свой jest.config.js:

module.exports = {
    "verbose": true   
}

Ответ 2

Вы можете найти рабочий пример и учебное пособие здесь.

Это все мои пакеты Babel:

"@babel/core": "^7.1.2",
"@babel/node": "^7.0.0",
"@babel/preset-env": "^7.1.0",
"@babel/preset-react": "^7.0.0",
"@babel/register": "^7.0.0",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^23.6.0",
"babel-loader": "^8.0.4"

И мне пришлось установить [email protected]^7.0.0-bridge.0 как указано на сайте Jest.

Мой .babelrc:

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ]
}

И мой скрипт npm: jest --config./test/jest.config.json Он не изменился для обновления Babel 7.

Ответ 3

4 дня назад Facebook добавил поддержку babel 7 для шуток, поэтому больше не нужно использовать мост babel 7.

Для получения дополнительной информации: https://github.com/facebook/jest/blob/master/README.md#using-babel

Ответ 4

Я боролся с этой проблемой в течение нескольких дней без удачи, пока не увидел этот пост. Большое спасибо всем за публикацию того, что сработало у них!

Вот моя конфигурация для ясности. Это приложение VueJs, использующее Jest. Надеюсь, это поможет кому-то :)

Мой скрипт npm для тестов

"test:unit": "jest --config ./jest.config.js"

Мои вавилонские пакеты

    "@babel/core": "^7.6.2",
    "babel-loader": "^8.0.4",
    "babel-core": "^7.0.0-bridge.0",
    "@babel/preset-env": "^7.6.2",
    "babel-eslint": "^10.0.1",
    "babel-jest": "^23.6.0",
    "@vue/cli-plugin-babel": "^3.11.0",

babel.config.js

module.exports = {
    presets: [
        [
            '@babel/preset-env',
            {
                debug: false,
                targets: {
                    browsers: ['last 3 versions'],
                },
            },
        ],
    ],
};

jest.confg.js

module.exports = {
    verbose: true,
    moduleFileExtensions: ['js', 'json', 'vue'],
    moduleNameMapper: {
        '^@/(.*)$': '<rootDir>/src/$1',
    },
    transform: {
        '^.+\\.vue$': 'vue-jest',
        '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
        '^.+\\.(js|jsx)?$': 'babel-jest',
    },
    transformIgnorePatterns: ['<rootDir>/node_modules/'],
    testMatch: ['**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'],
    collectCoverage: false,
    collectCoverageFrom: ['src/components/*.{js,vue}', '!**/node_modules/**'],
    coverageReporters: ['html', 'text-summary'],
};