facebook / prop-types

Runtime type checking for React props and similar objects
MIT License
4.48k stars 358 forks source link

The `prop-types` package import is not suddenly recognized when running jest #399

Closed dominikj111 closed 1 year ago

dominikj111 commented 1 year ago

I'm not sure if it is prop-types related, but this issue breaking my unit tests. I have been able to solve this by masking prop-types in the jest.config.js.

moduleNameMapper: {
   "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2||css)$": "<rootDir>/tests/__mocks__/fileMock.js",
   "^\\(Base\\)/(.*)$": "<rootDir>/src/Base/$1",
   "^\\(Utilities\\)/(.*)$": "<rootDir>/src/Utilities/$1",
   "^\\(DataFilter\\)/(.*)$": "<rootDir>/src/DataFilter/$1",
   "prop-types": "<rootDir>/tests/__mocks__/prop-types.js",
},

Where my prop-types.js looks like this:

const PropTypes = {
    arrayOf: () => ({}),
    shape: () => ({}),
    oneOfType: () => ({}),
    oneOf: () => ({}),
    objectOf: () => ({}),
    string: {},
    number: {},
    func: {},
    bool: {},
    object: {},
    element: {},
};

module.exports = PropTypes;
module.exports.default = PropTypes;

Is this an issue? How that happened?

I liked that my properties have been type checked during the testing.

ljharb commented 1 year ago

Do you have NODE_ENV set to production, perhaps? If so, that would break most test runs.

That said, I'm not sure why you're mocking it out, nor what "issue" you mean.

dominikj111 commented 1 year ago

NODE_ENV=development didn't change anything. That mock file I placed above allowed to pass the tests, but I see plenty warnings in the command line. I'll try to explain better.

I'm running my specific test file by npm test -- -i ./tests/DataFilter/DataFilter.test.jsx Suddenly my test start failing with this message

TypeError: Cannot read properties of undefined (reading 'string')

      21 |
      22 | ControlHeader.propTypes = {
    > 23 |      title: PropTypes.string,
         |                       ^
      24 |      helpSlug: PropTypes.string,
      25 |      showLoader: PropTypes.bool,
      26 | };

The "prop-types" is installed and I'm able to build and run my React application fine. When I did console.log(PropTypes) below the imports where import PropTypes from "prop-types" is mentioned, I got undefined in the cli.

All other own and third party imports work as expected except the "prop-types". Jest stopped recognizing this import. So I thought that mock of the import may help.

But because your message looks like that this is weird and yet unrecognized behavior, it would be better to make an example app :).

ljharb commented 1 year ago

Yes, a repro app would be most helpful. Either way, this package hasn't changed in awhile, so it's almost certainly something to do with jest or your jest config.

dominikj111 commented 1 year ago

I have minimal repository to reproduce this issue dominikj111/issue-minimal-proptypes-jest

The npm test will fail, but I realized that after rename the component ControlHeader.tsx to ControlHeader.jsx problem disappear. I don't know why yet.

dominikj111 commented 1 year ago

So on the end the problem was in the tsconfig.json file.

This is what I had:

{
  "include": ["src/**/*", "tests/**/*"],
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "nodenext",
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "noImplicitAny": false,
    "noImplicitThis": false,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "resolveJsonModule": true,
    "allowJs": true,
    "checkJs": true,
    "lib": ["ESNext", "DOM", "ESNext.String"],
    "jsx": "react",
    "baseUrl": "."
  }
}

And I was missing "esModuleInterop": true, :)

ljharb commented 1 year ago

aha, indeed - without esModuleInterop and allowSyntheticDefaultImports, TS's module system is fundamentally broken.