TypeError:environment.setup不是React Testing中的函数

时间:2018-01-08 11:05:30

标签: javascript reactjs testing packages

我试图实现Jest网站中显示的示例:Getting started with 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.jssum.test.jsGetting started with 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错误?

7 个答案:

答案 0 :(得分:19)

Jest包含在react-scripts中。该错误是由于在使用react-scripts启动的项目中安装Jest时出现的冲突。 “Jest入门”指南需要一个“干净”的项目。

只需从您的(dev)依赖项中删除Jest即可。

如果您想使用Jest来测试React组件(您可能会这样做),则需要将package.json中的测试脚本修改为react-scripts test --env=jsdom

答案 1 :(得分:12)

<击> 基于此github问题:@jest-environment node not working in 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.jssrc个文件,如官方getting started guide所示。

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文件中没有包含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.

测试结果:

package.json

第4步: 我更新了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

我再次运行$ 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. ,输出为:

jest

太长;没读(TL; DR)

  1. 如果您使用yarn add --dev jest命令,请勿使用npm install --save-dev jestcreate-react-app添加jest。如果您使用node-modules,则create-react-app包含在项目的package.json中。
  2. 来自official Jest documentation

      

    使用Create React App进行设置

         

    如果您刚开始使用React,我们建议您使用Create   反应App。它随时可以使用并随Jest一起发货!你不需要   做任何额外的设置步骤,并可以直接进入下一步   部分。

    1. 请勿更改"test": "react-scripts test --env=jsdom",文件{look at this issue}中的测试脚本。保留默认{{1}}。

答案 2 :(得分:7)

只需从您的dev依赖项中删除jest即可。为此,请运行以下命令:

npm remove --save-dev jest

答案 3 :(得分:4)

我的问题解决了这个问题:

如果你的package.json中有反应脚本和jest,请从中删除jest 然后删除package-lock.json,yarn.lock和node_modules 然后运行 npm install (或 yarn ,如果您使用它)。 〜丹阿布拉莫夫〜 。 issues #5119

答案 4 :(得分:2)

添加

"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 app并遇到此问题的人来说,有两种解决方案。

更新test命令(或添加新命令)在 package.json 中指向jest而不是react-scripts test,因为react-scripts test将不允许 package.json 中的jest选项作为@Xinyang_Li在评论中说明。

2 - 如果您不想在package.json中更改测试命令,请使用默认的create-react-app test;从packge.json中删除jest选项(如果存在) <击>

<击>
 "jest": {
    "testEnvironment": "node"
  }

<击> 然后删除 node_modules ,然后运行 npm install 再次安装它们,之后测试应该正常运行。

答案 5 :(得分:1)

您应该将已安装的jest降级为v20.0.4 npm install -D jest@20.0.4

答案 6 :(得分:0)

这是一个较旧的问题,但我遇到了同样的问题。我们有setupFormUI软件包,它使用Jest版本react-scripts,该版本存在20.x.x问题。我不能使用较新的coverageTreshold版本,唯一有用的是使用纱线分辨率,请在https://yarnpkg.com/lang/en/docs/selective-version-resolutions/上阅读更多内容。