问题
I am using the NumericInput and it works fine when I run the application on my device.
However, when I run jest
, I get all kind of errors:
TypeError: Cannot read property 'default' of undefined
at new Icon (node_modules/react-native-vector-icons/lib/create-icon-set.js:42:389)
at constructClassInstance (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:3435:18)
at updateClassComponent (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:6606:5)
at beginWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:7563:16)
at performUnitOfWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11234:12)
at workLoop (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11266:24)
at renderRoot (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11349:7)
at performWorkOnRoot (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:12237:7)
at performWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:12149:7)
at performSyncWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:12123:3)
and
console.error node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9036
The above error occurred in the <Icon> component:
in Icon (at NumericInput.js:226)
in View (created by View)
in View (at createAnimatedComponent.js:151)
in AnimatedComponent (at TouchableOpacity.js:282)
in TouchableOpacity (at Button.js:18)
in Button (at NumericInput.js:225)
in View (created by View)
in View (at NumericInput.js:224)
in NumericInput
in View (created by View)
in View
in View (created by View)
in View (at ScrollViewMock.js:29)
in RCTScrollView (created by _class)
in _class (at ScrollViewMock.js:27)
in ScrollViewMock (created by App)
in App
Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://.../react-error-boundaries to learn more about error boundaries.
First question: Is that normal?
Second question: If it is, how do I mock NumericInput
?
Following this guide, it seems I need to do:
jest.mock('react-native-numeric-input', () => 'NumericInput');
But it doesn't work. I also tried:
jest.mock('react-native-vector-icons', () => 'Icon');
With no success.
What is going on here o_0?
Cheers!
回答1:
This was a problem with react-native
's official jest preprocessor.
This was my jest config file:
const { defaults } = require('jest-config');
module.exports = {
preset: 'react-native',
transform: {
'^.+\\.js$': '<rootDir>/node_modules/react-native/jest/preprocessor.js',
'^.+\\.tsx?$': 'ts-jest'
},
moduleFileExtensions: [
'tsx',
...defaults.moduleFileExtensions
],
};
To solve the problem, this is my new jest config file:
const { defaults } = require('jest-config');
module.exports = {
preset: 'react-native',
transform: {
'^.+\\.tsx?$': 'ts-jest'
},
moduleFileExtensions: [
'tsx',
...defaults.moduleFileExtensions
],
};
You do not need the jest preprocessor transform item when using the 'react-native'
preset. For more info.
来源:https://stackoverflow.com/questions/56814268/how-to-mock-a-third-party-react-native-component-with-jest