TypeError: environment.setup не является функцией в React Testing

Я пытался реализовать пример, показанный на сайте Jest: Начало работы с Jest.

Во время выполнения npm test я получил следующую ошибку:

FAIL  src/sum.test.js
  ● Test suite failed to run

    TypeError: environment.setup is not a function

      at node_modules/jest-runner/build/run_test.js:112:23

sum.js:

function sum(a, b){
  return a+b;
}
module.exports = sum;

sum.test.js:

const sum = require('./sum');

test('adding sum function', () => {
  expect(sum(234,4)).toBe(238);
})

sum.js и sum.test.js являются точной копией примера, показанного в разделе Начало работы с Jest.

package.json:

{
  "name": "jest-demo-test",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "react-scripts": "1.0.17"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "jest",
    "eject": "react-scripts eject"
  },
  "devDependencies": {
    "jest": "^22.0.4"
  }
}

Итак, как я могу избавиться от TypeError: environment.setup is not a function ошибкой TypeError: environment.setup is not a function?

Ответ 1

Jest включен в ответные скрипты. Ошибка связана с конфликтом, который возник при установке Jest в проект, запущенный с помощью activ-скриптов. Руководство "Начало работы с Jest" предполагает "чистый" проект.

Просто удалите Jest из ваших (dev) зависимостей, и это должно работать.

Если вы хотите использовать Jest для тестирования компонентов React (что вы, вероятно, делаете), вам нужно изменить свой тестовый сценарий в package.json чтобы он react-scripts test --env=jsdom.

Ответ 2

Основываясь на этой проблеме github: @jest-environment узел не работает в v22 ,

Я обновил sum.test.js как:

/**
 * @jest-environment node
 */

const sum = require('./sum');

test('adding sum function', () => {
  expect(sum(234,4)).toBe(238);
})

Теперь я избавился от TypeError: environment.setup is not a function.

Выход:

PASS  src/sum.test.js
  ✓ adding sum function (2ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.438s
Ran all test suites.

обновленный

Прочитав несколько ответов, сегодня я воссоздал сценарий.

Шаг 1: Я создал новый проект, используя create-react-app.

Команда: create-react-app demo-app

файл package.json:

{
  "name": "demo-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "react-scripts": "1.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

Этот файл показывает, что jest не включена в зависимости.

Шаг 2: Я включил sum.js и sum.test.js в папку src как показано в официальном руководстве по sum.test.js.

sum.js:

function sum(a, b) {
  return a + b;
}
module.exports = sum;

sum.test.js:

const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

Шаг 3: Я yarn test команду yarn test без включения jest в файл package.json. Итак, в этой тестовой команде используется react-scripts test --env=jsdom как показано в package.json.

Вывод теста:

PASS  src/sum.test.js
PASS  src/App.test.js

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.594s, estimated 1s
Ran all test suites related to changed files.

Шаг 4: Я обновил файл package.json чтобы использовать jest качестве тестового скрипта:

{
  "name": "demo-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "react-scripts": "1.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "jest",
    "eject": "react-scripts eject"
  }
}

Я снова запустил yarn test на yarn test и вывел:

$ jest
 PASS  src/sum.test.js
 FAIL  src/App.test.js
  ● Test suite failed to run

    /<PATH>/demo-app/src/App.test.js: Unexpected token (7:18)
         5 | it('renders without crashing', () => {
         6 |   const div = document.createElement('div');
      >  7 |   ReactDOM.render(<App />, div);
           |                   ^
         8 |   ReactDOM.unmountComponentAtNode(div);
         9 | });
        10 | 

Test Suites: 1 failed, 1 passed, 2 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.645s, estimated 1s
Ran all test suites.

Слишком долго; Не читал (TL; DR)

  1. Не добавляйте jest используя yarn add --dev jest или npm install --save-dev jest если вы используете npm install --save-dev jest create-react-app. jest включается в node-modules проекта, если вы используете create-react-app.

Из официальной документации Jest:

Настройка с помощью приложения "Создать React"

Если вы только начинаете работать с React, мы рекомендуем использовать приложение "Создать React". Он готов к использованию и поставляется с Jest! Вам не нужно делать никаких дополнительных шагов для настройки, и вы можете перейти прямо к следующему разделу.

  1. Не изменяйте тестовый скрипт в файле package.json { посмотрите на эту проблему }. Оставьте значение по умолчанию "test": "react-scripts test --env=jsdom", в этом.

Ответ 3

Просто удалите jest из ваших зависимостей dev. Для этого выполните следующую команду:

npm remove --save-dev jest

Ответ 4

Моя проблема решается с помощью этого:
,
Если в вашем файле package.json есть оба сценария реакции и jest, удалите из него jest.
Затем удалите package-lock.json, yarn.lock и node_modules.
Затем запустите npm install (или yarn, если вы его используете). ~ Дан Абрамов ~. Выпуски № 5119.

Ответ 5

добавлять

"jest": {
    "testEnvironment": "node"
  }

в вашем файле package.json ваш package.json будет выглядеть так:

{
  "name": "jest-demo-test",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "react-scripts": "1.0.17"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "jest",
    "eject": "react-scripts eject"
  },
  "devDependencies": {
    "jest": "^22.0.4"
  },
   "jest": {
    "testEnvironment": "node"
  }
}

ОБНОВИТЬ

для людей, использующих приложение create и имеющих эту проблему, есть два решения.

1- обновите test команду (или добавьте новую) в package.json для jest вместо react-scripts test, потому что react-scripts test не разрешит опции jest в package.json, как указано @Xinyang_Li в комментариях.

2 - если вы не хотите изменять команду test в package.json и используете тест по умолчанию create-реагировать-app; удалить опции jest из packge.json (если есть)

 "jest": {
    "testEnvironment": "node"
  }

затем удалите node_modules и затем запустите npm install, чтобы установить их все снова, и после этого ваши тесты должны работать нормально.

Ответ 6

Вы должны понизить установленный jest до v20.0.4 npm install -D [email protected]

Ответ 7

Это старая проблема, но я столкнулся с той же проблемой. У нас есть пакет 20.xx react-scripts, и он использует Jest версии 20.xx которого есть проблемы с coverageTreshold. Я не мог использовать более новую версию react-scripts и единственное, что мне помогло, - это использование разрешения пряжи, читайте больше здесь https://yarnpkg.com/lang/en/docs/selective-version-resolutions/.