TypeError: environment.setup is not a function in React Testing

I was trying to implement the example shown in Jest website: Getting started with Jest.

While running npm test on I was getting the following error:

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 and sum.test.js are an exact copy of the example shown in Getting 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"
  }
}

So, how can I get rid of TypeError: environment.setup is not a function error?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Jest is included with react-scripts. The error is due to a conflict that arose when you installed Jest in a project started with react-scripts. The “Getting started with Jest” guide expects a ‘clean’ project.

Simply remove Jest from your (dev)dependencies and it should work.

If you want to use Jest for testing React components (which you probably do), you need to modify your test script in package.json to react-scripts test --env=jsdom, as it was.

Method 2


Based on this github issue: @jest-environment node not working in v22,

I updated the sum.test.js as:

/**
 * @jest-environment node
 */

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

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


Now I got rid of the TypeError: environment.setup is not a function.

Output:

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.

Updated

Reading several answers, today I recreated the scenario.

Step 1:
I created a new project using create-react-app.

The command: create-react-app demo-app

package.json file:

{
  "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"
  }
}

This file shows that jest is not included in the dependencies.

Step 2:
I included sum.js and sum.test.js files in src folder as shown in the official 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);
});

Step 3:
I ran yarn test command without including jest in package.json file.
So, this test command uses react-scripts test --env=jsdom as shown in package.json.

Output of the test:

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.

Step 4:
I updated the package.json file to use jest as test script:
{
  "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"
  }
}

Again I ran yarn test and the output is:
$ 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.

Too Long; Did not Read (TL;DR)

  1. Do not add jest using yarn add --dev jest or npm install --save-dev jest if you use create-react-app command. jest is included in node-modules of the project if you use create-react-app.

From official Jest documentation:

Setup with Create React App

If you are just getting started with React, we recommend using Create
React App. It is ready to use and ships with Jest! You don’t need to
do any extra steps for setup, and can head straight to the next
section.

  1. Do not change the test script in package.json file { look at this issue }. Keep the default "test": "react-scripts test --env=jsdom", in that.

Method 3

Just remove jest from your dev dependencies. To do so, run the following command:

npm remove --save-dev jest

Method 4

My issue solve with this:
.
If you have both react-scripts and jest in your package.json, delete jest from it.
Then delete package-lock.json, yarn.lock and node_modules.
Then run npm install (or yarn if you use it). ~Dan Abramov~
.
issues #5119
.

Method 5

Add

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

to your package.json file, your package.json would look like this:
{
  "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"
  }
}

UPDATE

for the people using create app and having this problem, there are two solutions.

1- update testcommand (or add new one) in package.json to jest instead of react-scripts test, because react-scripts test will not allow jest options in package.json as @Xinyang_Li stated in comments.

2-if you don’t want to change test command in package.json, and use default create-react-app test; remove jest options from packge.json (if exists)

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


then remove node_modules and then run npm install to install them all again, and after that your tests should run normally.

Method 6

You should downgrade installed jest to v20.0.4
npm install -D [email protected]

Method 7

This is an older issue but I was facing the same problem. We have react-scripts package and it uses Jest version 20.x.x which has problems with coverageTreshold. I couldn’t use newer react-scripts version and the only thing helped was to use yarn resolutions, read more here https://yarnpkg.com/lang/en/docs/selective-version-resolutions/.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x