如何用Jest mockReturnValue测试异步getStuff函数的状态更新?
Jest异步函数
getStuff单元测试的正确Mock方式 我来帮你修正这个Jest测试的问题,核心是要正确处理异步函数的Mock,咱们一步步来:
首先,你当前的Mock写法有个关键问题:helpers.getStuffFromServer是异步函数(你用await调用它),它返回的是Promise,这时候不能用mockReturnValue,得用Jest专门处理异步场景的mockResolvedValue方法。另外,mockReturnValue不需要包裹成箭头函数,直接传入预期返回值即可。
下面是完整的修正后的测试代码,附带关键点解释:
完整测试代码
// 先确保你已经mock了helpers模块(替换成实际路径) jest.mock('../path/to/helpers'); it('should get stuff & update state correctly', async () => { // 1. 准备模拟数据 const dummyData = { x: 'test-x-value', y: 'test-y-value' }; const mockServerResponse = { x: dummyData.x, y: dummyData.y }; // 2. 正确Mock异步函数:用mockResolvedValue返回Promise helpers.getStuffFromServer.mockResolvedValue(mockServerResponse); // 3. 准备组件的props和初始state const fakeBazz = jest.fn(); const testProps = { data: { foo: 'test-foo' }, // 对应this.props.data.foo bazz: fakeBazz // 对应this.props.bazz }; const initialState = { bar: 'test-bar' }; // 对应this.state.bar // 4. 渲染组件,传入props和初始state(假设你的setup函数支持传初始state) const wrapper = setup(testProps, initialState); // 5. 调用组件的getStuff方法,并用await等待异步操作完成 await wrapper.instance().getStuff(); // 6. 断言:验证getStuffFromServer是否被正确调用 expect(helpers.getStuffFromServer).toHaveBeenCalledWith( testProps.data.foo, initialState.bar, fakeBazz ); // 7. 断言:验证组件state是否被正确更新 expect(wrapper.state('x')).toBe(dummyData.x); expect(wrapper.state('y')).toBe(dummyData.y); });
关键细节说明
- 异步函数Mock规则:对于返回Promise的异步函数,必须用
mockResolvedValue(成功场景)或mockRejectedValue(失败场景),mockReturnValue仅适用于同步函数。 - 等待异步完成:调用异步的
getStuff方法时一定要加await,否则测试会在异步操作结束前提前执行断言,导致结果不准确。 - 参数正确性验证:通过
toHaveBeenCalledWith可以确保getStuffFromServer接收到了来自props和state的正确参数,这能有效验证业务逻辑的合理性。 - state更新断言:最后检查组件state是否符合预期,确保
setState的执行逻辑正确。
如果你的setup函数不支持传入初始state,也可以在渲染后手动设置:
wrapper.setState({ bar: 'test-bar' });
内容的提问来源于stack exchange,提问作者hloughrey
相关产品推荐
相关产品推荐

