如何用 jest 模拟第三方 react-native 组件?
How to mock a third party react-native component with jest?
我正在使用 NumericInput,当我 运行 我的设备上的应用程序时它工作正常。
然而,当我 运行 jest
时,我得到了各种错误:
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)
和
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.
第一个问题:正常吗?
第二个问题:如果是,我如何模拟NumericInput
?
在this guide之后,看来我需要做的是:
jest.mock('react-native-numeric-input', () => 'NumericInput');
但是没用。我也试过:
jest.mock('react-native-vector-icons', () => 'Icon');
没有成功。
这是怎么回事o_0?
干杯!
这是 react-native
的官方笑话预处理器的问题。
这是我的笑话配置文件:
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
],
};
为了解决这个问题,这是我新的 jest 配置文件:
const { defaults } = require('jest-config');
module.exports = {
preset: 'react-native',
transform: {
'^.+\.tsx?$': 'ts-jest'
},
moduleFileExtensions: [
'tsx',
...defaults.moduleFileExtensions
],
};
使用 'react-native'
预设时不需要 jest 预处理器转换项。 For more info.
我正在使用 NumericInput,当我 运行 我的设备上的应用程序时它工作正常。
然而,当我 运行 jest
时,我得到了各种错误:
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)
和
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.
第一个问题:正常吗?
第二个问题:如果是,我如何模拟NumericInput
?
在this guide之后,看来我需要做的是:
jest.mock('react-native-numeric-input', () => 'NumericInput');
但是没用。我也试过:
jest.mock('react-native-vector-icons', () => 'Icon');
没有成功。
这是怎么回事o_0?
干杯!
这是 react-native
的官方笑话预处理器的问题。
这是我的笑话配置文件:
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
],
};
为了解决这个问题,这是我新的 jest 配置文件:
const { defaults } = require('jest-config');
module.exports = {
preset: 'react-native',
transform: {
'^.+\.tsx?$': 'ts-jest'
},
moduleFileExtensions: [
'tsx',
...defaults.moduleFileExtensions
],
};
使用 'react-native'
预设时不需要 jest 预处理器转换项。 For more info.