javascript - 如何在 graphql-tool 中传递查询参数?

标签 javascript graphql graphql-tools

我正在使用 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 中传递查询参数?谢谢

最佳答案

这取决于您希望测试数据的一致性。如果您只关心 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" 的用户数据对象。但是,如果您希望整个用户对象在整个测试过程中保持不变,则需要在模拟函数之外创建模拟用户数据,并相应地查询和过滤数据。

关于javascript - 如何在 graphql-tool 中传递查询参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412215/

相关文章:

javascript - 限制 d3.js 缩放到容器

javascript - CSS/JavaScript : After Hover effect

java - 如何使用 okHttpClient 执行 graphql 查询?

graphql - 使用 makeRemoteExecutableSchema 拼接安全订阅

graphql - 在 GraphQL 中的输入和类型之间共享公共(public)字段

javascript - jQuery - 输入字段中的多个电子邮件地址

javascript - ASP.NET 通过 JavaScript 单击按钮从事件处理程序热重定向

node.js - 尝试连接调试器时 Azure Functions 崩溃,导致 nodemon 永久重新加载

graphql - 如何在graphql查询过滤器中使用OR/AND或使大小写不敏感的过滤器?