问题记录
背景:通过 Jest 和 React Testing Library 对 React Native 做自动化测试
问题: 代码中呈现 AppState 的应用
import { AppState } from 'react-native';
AppState.removeEventListener('change', handleAppStateChange);
报错:TypeError: import_react_native.AppState.removeEventListener is not a function
jest.config.js 配置应用了 React Native 预设
module.exports = {
preset: 'react-native',
...
通过排查发现是因为 React Native 提供的 jest mock 文件缺失局部办法
门路:*/react-native/jest/setup.js
.mock('react-native/Libraries/AppState/AppState', () => ({
addEventListener: jest.fn(() => ({
remove: jest.fn(),
})),
}))
解决方案:
我的项目长期计划是将 packages/react-native/jest/setup.js 拷贝下来,减少 react-native/Libraries/AppState/AppState 模块的 removeEventListener 和 currentState办法的mock
.mock('react-native/Libraries/AppState/AppState', () => ({
addEventListener: jest.fn(() => ({
remove: jest.fn(),
})),
removeEventListener: jest.fn(),
currentState: jest.fn(),
}))
而后放在我的项目仓库中在 jest.setup.js 文件头部引入
或者在 jest.config.js 的 setupFilesAfterEnv 入口引入
最初,这个缺点我曾经给 React Native 官网仓库提了Pull Request,曾经合并主分支了
原文链接:https://w3cay.com/post/db420c1d.html