You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试时Relay fragment不返回Mock数据的问题咨询

可能的问题点按触发概率从高到低排列:


  1. 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。

  1. 测试用的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也无法识别。

  1. 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。

  1. 缺少渲染等待逻辑
    你调用resolveMock是在render之后,部分测试渲染库不会自动触发重渲染,你可以在resolve之后加等待逻辑,确保组件完成数据加载后的渲染:
// 比如使用react-testing-library的waitFor
await waitFor(() => {
  expect(screen.getByText("测试用户名")).toBeInTheDocument()
})

内容的提问来源于stack exchange,提问作者MDalt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:06:03