The `prop-types` package import is not suddenly recognized when running jest
dominikj111 opened this issue · 6 comments
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.
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.
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 :).
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.
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.
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,
:)
aha, indeed - without esModuleInterop and allowSyntheticDefaultImports, TS's module system is fundamentally broken.