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

时间:2019-01-29 00:26:39

标签: 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',这给我在前端显示它带来了一些麻烦。

我认为我可以在下面做类似的事情,但事实证明我错了。在下面的代码中,userundefined

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

是否可以在graphql-tools中传递查询参数?谢谢

1 个答案:

答案 0 :(得分:2)

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