【问题标题】:How to pass query arguments in graphql-tool?如何在 graphql-tool 中传递查询参数?
【发布时间】:2019-06-22 01:25:04
【问题描述】:

我正在使用graphql-tool 模拟数据进行测试。

我希望模拟当我选择一个用户时,它会打开一个详细页面并显示用户公司信息。

查询

const query = `
  query User($id: ID!) {
    user(id: $id) {
      id
      company
    }
  }
`;

模拟服务器

import { addMockFunctionsToSchema } from 'graphql-tools';
import casual from 'casual';

const allUserIds = ['u1', 'u2', 'u3'];

const mocks = {
  User: () => ({
    id: casual.random_element(allUserIds),
    name: casual.name,
    company: casual.company_name
  })
};

addMockFunctionsToSchema({ schema, mocks });

但是,现在,当我使用参数 id 'u1' 进行查询时,它会返回一个随机用户 id,例如 'u2',这给我在前端显示它带来了一些麻烦。

我以为我可以在下面做这样的事情,但事实证明我错了。 user 在下面的代码中是 undefined

const mocks = {
  User: (user) => ({
    id: user.id || casual.random_element(allUserIds),
    name: casual.name,
    company: casual.company_name
  })
};

有没有办法在 graphql-tools 中传递查询参数?谢谢

【问题讨论】:

  • 如果您希望在整个测试过程中保持测试数据的持久性,最好使用假/模拟对象的集合或具有一致种子的模拟数据生成器。
  • @ClaireLin 谢谢,我确实试过了。但还没想好我应该在哪里使用casual.seed(123);。首先,我尝试在导入后立即放在上面,它没有任何效果。然后我尝试放入像const mocks = { User: () => { casual.seed(0); return { id: casual.random_element(allUserIds), ... } } }; 这样的模拟,它会给我所有用户相同的信息。

标签: javascript graphql graphql-tools


【解决方案1】:

这取决于您希望测试数据的一致性。如果您只关心id 与您的查询参数保持一致,那么您可以执行以下操作:

const mocks = {
  Query: () => ({
    user: (root, user) => ({
      id: user.id || casual.random_element(allUserIds),
      name: casual.name,
      company: casual.company_name
    })
  })
};

As mentioned here 在文档中,模拟函数就像 GraphQL 解析器。因此函数的参数遵循每个字段可用的root, arguments, context 的相同顺序。

请在此处查看code sandbox 进行现场演示。

这保证每当您查询 id 为 u1 的用户时,您总是会收到一个带有其 id = "u1" 的用户数据对象,其中包含随机生成的公司和名称字段。但是,如果您希望整个用户对象在整个测试过程中保持不变,则需要在模拟函数之外创建模拟用户数据,并相应地查询和过滤数据。

【讨论】:

  • 谢谢!!我错过了那部分文件。我根据您的旧User: () => ({ id: (root, { id }) => id, ... 进行了一些修正。当我尝试使用id: (root, something) => id 时,something 将始终为空对象,这使得id 未定义。当我像User: (root, user) => ({ id: user.id || casual.random_element(allUserIds), 一样将它移到顶部时,它就可以工作了。
  • 啊,你是对的。我对您的查询 User 和带有 PascalCase 的 User 类型感到困惑。我建议遵循命名约定并将查询重命名为 camelCase user 以减少混淆。
  • @HongboMiao 我添加了一个现场演示并在此处更新了代码 sn-p 以澄清user 实际上是query
  • 哦,我确实遵循了名称转换。我认为您误解了我的代码。我的User 在根模拟(与Query 相同级别)下,应该大写。它适用于所有 GraphQL 模式中使用的所有 User 类型,而不仅仅是在查询中。但无论如何感谢您的指导!
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2017-09-27
  • 2023-01-26
  • 1970-01-01
  • 2018-03-08
相关资源
最近更新 更多