skip to Main Content

I’m newish to React and React Testing. I’ve been taking an Udemy course that is a few years old and some things are out of date. I got things updated with a lot of work. I can build, I can start the app. However, my once working tests now fail with this error:

Test suite failed to run
    ReferenceError: global is not defined
      at Object.<anonymous> (node_modules/graceful-fs/graceful-fs.js:92:1)
      at Object.<anonymous> (node_modules/expect/build/toThrowMatchers.js:10:24)
      at Object.<anonymous> (node_modules/expect/build/index.js:35:48)

I found an old StackOverflow post with this error, but the solution there did not work. I replaced "jest-environment-jsdom-sixteen": "^2.0.0" with "jest-environment-jsdom": "^27.0.6". I got all sorts of bizarre errors in tests that previously worked.

I reverted my package.json back

I ran a command I found in github about this issue:

$ npm list jest
[email protected] 
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected] deduped invalid: "^29.0.0" from node_modules/ts-jest
│ └── [email protected] invalid: "^29.0.0" from node_modules/ts-jest
└─┬ [email protected]
  └── [email protected] deduped invalid: "^29.0.0" from node_modules/ts-jest

It looks like there might be conflicting packages. I deleted my node_modules directory and ran yarn install. No joy.

Here is a copy of package.json:

{
  "name": "react-testing",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/dom": "^10.4.0",
    "@types/node": "^22.1.0",
    "@types/react": "^18.3.3",
    "@types/react-dom": "^18.3.0",
    "axios": "^1.7.3",
    "invariant": "^2.2.4",
    "levenary": "^1.1.1",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-scripts": "5.0.1"
  },
  "devDependencies": {
    "@testing-library/jest-dom": "^6.4.8",
    "@testing-library/react": "^16.0.0",
    "@testing-library/user-event": "^14.5.2",
    "@types/jest": "^29.5.12",
    "jest-environment-jsdom-sixteen": "^2.0.0",
    "ts-jest": "^29.2.4",
    "typescript": "~5.5.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jest-environment-jsdom-sixteen",
    "coverage": "yarn test --coverage --watchAll=false",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "jest": {
    "collectCoverageFrom": [
      "src/**/*.{ts,tsx,js,jsx}",
      "!src/serviceWorker.ts",
      "!src/index.tsx",
      "!src/**/*.d.ts"
    ]
  }
}

Here is a copy of my test file

import React from "react";
import { fireEvent, render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import CustomInput from "./CustomInput";

describe("When everything is OK", () => {
  test("should call the onChange callback handler when using the fireEvent function", () => {
    const onChange = jest.fn();
    render(
      <CustomInput value="" onChange={onChange}>
        Input:
      </CustomInput>
    );
    fireEvent.change(screen.getByRole("textbox"), {
      target: { value: "David" },
    });

    // Does not fail, though the onChange gets called 5 time -> 5 keystrokes
    // for a user to type D a v i d
    // fireEvent copies 'David' in with one shot
    expect(onChange).toHaveBeenCalledTimes(1);
  });
  test("should call the onChange callback handler when using the userEvent API", async () => {
    const onChange = jest.fn();
    render(
      <CustomInput value="" onChange={onChange}>
        Input:
      </CustomInput>
    );

    userEvent.type(screen.getByRole("textbox"), "David");

    // Needs to be 5 instead of 1.
    //userEvent unlike fireEvent() does not copy 'David' in all at once,
    // producing just 1 onChange call
    // userEvent more closely simulates a user who would type D a v i d,
    // calling onChange 5 times
    expect(onChange).toHaveBeenCalledTimes(5);
  });
});

Any clues?

2

Answers


  1. Can I see your test code? I think your problem is with the global object. This object is for Node.js. Try using window or document instead.

    Login or Signup to reply.
  2. The issue stems from conflicting Jest versions and an outdated environment setup. Your react-scripts relies on Jest 27, while ts-jest expects Jest 29, causing errors. Additionally, the use of jest-environment-jsdom-sixteen might be unnecessary, leading to environment issues like the global is not defined error. To resolve this, align all Jest-related dependencies to compatible versions, update to the latest jest-environment-jsdom, and clean-install your node modules. This should stabilize your testing environment and fix the error.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search