单元测试时Relay fragment不返回Mock数据的问题咨询
可能的问题点按触发概率从高到低排列:
- React组件参数解构错误
你的Row组件定义存在语法问题:React函数组件的第一个参数永远是完整的props对象,你现在的写法是把整个props对象赋值给了me变量,而不是取props里的me字段。
正确的写法应该是:
// 错误写法:me是整个props对象,值为 { me: 你传入的用户数据 } const Row = (me) => { ... } // 正确写法:解构props拿到me字段 const Row = ({ me }) => { const {name, email} = useFragment(RowFragment, me) return ... }
你传入useFragment的参数实际是整个props对象,不是Relay需要的fragment引用数据,自然返回undefined。
- 测试用的TestQuery没有正确引入RowFragment
Relay要求所有用到的fragment必须在父查询中显式spread,否则查询返回的数据不会携带fragment匹配需要的元信息,useFragment无法解析出对应数据。你需要确保TestQuery的结构类似:
const TestQuery = graphql` query TestQuery($variables: YourVariablesType) { viewer { me { # 必须显式spread你的RowFragment ...RowFragment_me } } } `
如果缺少这个spread,哪怕mock返回了name、email字段,useFragment也无法识别。
- Mock返回的me字段为null/无效值
你可以在resolve操作时手动指定me的返回值,排查是否是MockPayloadGenerator自动生成的数据不符合预期:
act(() => { environment.mock.resolveMostRecentOperation(operation => MockPayloadGenerator.generate(operation, { User: () => ({ name: "测试用户名", email: "test@example.com" }) }) ) })
同时可以在TestComponent里打印props.viewer.me,确认该值确实存在且不是null。
- 缺少渲染等待逻辑
你调用resolveMock是在render之后,部分测试渲染库不会自动触发重渲染,你可以在resolve之后加等待逻辑,确保组件完成数据加载后的渲染:
// 比如使用react-testing-library的waitFor await waitFor(() => { expect(screen.getByText("测试用户名")).toBeInTheDocument() })
内容的提问来源于stack exchange,提问作者MDalt
相关产品推荐
相关产品推荐

