React Native中启用可达性需传入NetInfo至networkMonitor,及使用aws-amplify Auth的快照测试报错求助
解决AWS Amplify在React Native中启用可达性时NetInfo传入问题及快照测试失败问题
我之前也碰到过完全一样的问题,这个错误的核心原因是AWS Amplify的Reachability模块在React Native环境下,必须依赖NetInfo来检测网络连接状态——不管是应用正常运行时,还是快照测试的模拟环境中,都需要正确配置这个依赖。下面分两部分给出具体的解决步骤:
一、正常应用运行时的配置
首先要确保你已经安装了NetInfo依赖,然后在Amplify初始化时把它传入networkMonitor配置项:
- 安装NetInfo依赖
在项目根目录执行:
npm install @react-native-community/netinfo # 或者用yarn yarn add @react-native-community/netinfo
如果是iOS项目,安装后记得执行npx pod-install来完成原生依赖的配置。
- 修改Amplify初始化代码
找到你项目中初始化Amplify的文件(通常是src/aws-exports.js或者专门的配置文件),添加networkMonitor配置:
import { Amplify } from 'aws-amplify'; import NetInfo from '@react-native-community/netinfo'; import awsconfig from './aws-exports'; Amplify.configure({ ...awsconfig, // 配置networkMonitor,传入NetInfo作为处理程序 networkMonitor: { handler: NetInfo, }, });
这样配置后,应用运行时就不会再弹出"需将NetInfo传入networkMonitor"的提示了。
二、快照测试的修复方案
快照测试失败是因为测试环境没有原生React Native环境支撑NetInfo的正常运行,我们需要通过Mock来模拟NetInfo的行为,或者直接Mock Amplify的Reachability模块:
方案1:Mock NetInfo模块
在你的测试文件顶部添加以下Mock代码,模拟NetInfo的核心方法:
jest.mock('@react-native-community/netinfo', () => ({ // 模拟网络状态监听方法 addEventListener: jest.fn(), removeEventListener: jest.fn(), // 模拟获取网络状态,返回已连接状态 fetch: jest.fn().mockResolvedValue({ isConnected: true }), }));
这样Amplify在测试时调用NetInfo的方法就不会抛出错误了。
方案2:Mock Amplify内部的Reachability模块
如果不想Mock NetInfo,也可以直接Mock Amplify的Reachability原生模块,跳过真实的网络检测逻辑:
jest.mock('@aws-amplify/core/src/Util/Reachability.native', () => ({ ReachabilityNavigator: { networkMonitor: jest.fn(), }, }));
方案3:在测试前初始化Amplify时传入Mock的networkMonitor
你也可以在测试的beforeEach钩子中,重新配置Amplify,传入一个Mock的networkHandler:
import { Amplify } from 'aws-amplify'; beforeEach(() => { Amplify.configure({ networkMonitor: { handler: { addEventListener: jest.fn(), fetch: jest.fn().mockResolvedValue({ isConnected: true }), }, }, }); });
这几个方案都能解决快照测试时的报错问题,你可以根据自己的测试习惯选择其中一种。
内容的提问来源于stack exchange,提问作者chandan
相关产品推荐
相关产品推荐

