React中被connect和Provider包裹的组件测试时如何访问内部节点
解决步骤
1. 先Mock目标工具函数
你要测试的点击逻辑最终调用的是common-util里导出的handlePrintLabelButtonClick,直接用jest Mock对应模块即可:
// 放在测试文件顶部,和import语句同层级 import * as commonUtils from '../../utils/common-util'; // Mock目标函数 jest.mock('../../utils/common-util', () => ({ ...jest.requireActual('../../utils/common-util'), handlePrintLabelButtonClick: jest.fn() }));
2. 确保测试前置条件满足
MetaDetails里showPrintLabelButton控制按钮是否渲染,你构造store的时候要保证对应状态值为true,否则按钮不会出现在DOM树里,自然查找不到。
3. 调整测试用例代码
test("点击打印标签按钮触发对应逻辑", () => { // 先重置Mock函数调用记录 commonUtils.handlePrintLabelButtonClick.mockClear(); // 构造mock事件对象,满足preventDefault调用要求 const mockEvent = { preventDefault: jest.fn() }; const wrapper = mount( <Provider store={store}> <MetaDetails/> </Provider> ); // 直接通过data-test属性查找按钮,hostNodes()适配emotion样式组件返回真实DOM节点 const printButton = wrapper.find(`[data-test="print-label-button"]`).hostNodes(); // 确认按钮成功渲染 expect(printButton.exists()).toBe(true); // 触发点击 printButton.simulate('click', mockEvent); // 验证目标函数被调用 expect(commonUtils.handlePrintLabelButtonClick).toHaveBeenCalled(); // 也可以进一步验证入参是否符合预期 expect(commonUtils.handlePrintLabelButtonClick).toHaveBeenCalledWith( mockEvent, expect.any(String), // 这里换成你预期的rmaNumber值 expect.any(String), // 这里换成你预期的labelUrl值 expect.any(Function) // 这里换成你预期的getReturnLabel值 ); });
常见问题排查
- 如果还是查找不到按钮,先打印
wrapper.debug()看完整渲染的DOM结构,确认按钮是否真的渲染出来,以及data-test属性是否正确挂载 - 不需要额外查找
MetaDetails组件实例,mount会渲染所有嵌套组件,直接从根wrapper查找属性即可
内容的提问来源于stack exchange,提问作者Jane Dawson
相关产品推荐
相关产品推荐

