故事书的模拟数据生成

Mock data generation for storybook

我正在尝试使用故事书的中继生成模拟数据。 我的查询是

const QUERY_LIST = graphql`
  query modelControllerAllUsersQuery @relay_test_operation {
    allUsers {
      pageInfo {
        hasNextPage
      }
      edges {
        node {
          id
          firstName
          lastName
        }
      }
    }
  }
`

并提供 RelayEnvironmentProvider 作为故事的装饰器。我正在尝试 return 使用自定义模拟解析器为我的查询设置一些默认值。

  const customMockResolvers = {
    ...mockResolvers,
    allUsers:() => ({
      pageInfo:{
        hasNextPage:false,
      },
      edges:[
        {
          node:{
            id       :'id',
            firstName:'fname',
            lastName :'lname',
          },
        },
      ],
    }),
  };

并将其称为

(operation) => MockPayloadGenerator.generate(operation, customMockResolvers)

我似乎无法获得默认值 returned。 目前,它是 returning

{"allUsers":{"pageInfo":{"hasNextPage":false},"edges":[{"node":{"id":"<UserNode-mock-id-1>","firstName":"<mock-value-for-field-\"firstName\">","lastName":"<mock-value-for-field-\"lastName\">"}}]}}

我做错了什么?

使用 @relay-test-operation 时,customMockResolvers 对象中的键必须与字段的类型名称匹配,该名称可以与字段名称本身不同。

例如,您的架构中可以包含以下内容:

type Foo {
  id: ID!
  name: String!
}

和以下查询:

query FooQuery @relay_test_operation {
  foo {
    id
    name
  }
}

那么 customMockResolvers 对象将如下所示:

const customMockResolvers = {
  Foo: () => ({
    id: "fooId",
    name: "fooName"
  })
}

请注意,我传递的是 Foo 作为键而不是 foo

您可以检查您的模式并查看 allUsers 的类型名称是什么。我怀疑它会像 AllUsersallUsersConnection 或类似的东西。


此外,如果您有兴趣为 Relay 组件创建 Storybook 故事,我为此创建了一个 NPM 包:https://www.npmjs.com/package/use-relay-mock-environment

它不需要将 @relay-test-operation 指令添加到您的查询中,而是仅依赖于解析 String 类型(这是所有标量属性的默认值)。当然,您仍然可以添加 @relay-test-operation 指令,还可以通过在配置中提供 customResolvers 来扩展解析器。 您还可以通过在配置中提供 extendStringResolver 来扩展 String 解析器。

如果您想实现类似的功能,请随时查看此处的源代码:https://github.com/richardguerre/use-relay-mock-environment

注意:它仍处于早期阶段,所以有些事情可能会改变,但希望得到一些反馈!