根据服务器模式验证React GraphQL标签

时间:2019-03-05 10:19:54

标签: reactjs graphql apollo

我想根据我们的graphql服务器上生成的模式在我们的react客户端上验证graphql标签。该验证将作为测试设置的一部分运行,并在graphql模式定义中发生重大更改时警告我们。

到目前为止,我已经使用apollo schema:download --endpoint=http...

从服务器提取了schema.json。

现在,我想测试以下突变:

import gql from 'graphql-tag';

const LOGIN_MUTATION = gql`
    mutation LoginMutation($email: String!, $password: String!) {
        login(email: $email, password: $password) {
            id
            accessToken
            refreshToken
            expires
        }
    }
`;

进行如下测试:

import { GraphQLSchema } from 'graphql';
import { validate } from 'graphql/validation';
import * as schemaJson from '../../../../../backend/schema.json';
const schema = new GraphQLSchema(schemaJson as any);
import { LOGIN_MUTATION } from './Auth';

test("validate login mutation", assert => {
    const errors = validate(schema, LOGIN_MUTATION);
    const isValid = !errors.length;
    expect(isValid).toBe(true);
});

这给了我错误:Query root type must be provided

如何针对给定的json模式验证graphql标签?

2 个答案:

答案 0 :(得分:1)

您不需要编写单元测试就可以根据给定的json模式检查graphql标签。

在开发过程中,您可以使用WebStorm IDE plugin或类似工具或Visual Studio Code plugin。它看起来像这样: enter image description here

在构建CI / CD之前,您可以使用GraphQL eslint plugin作为检查代码样式的一部分。

答案 1 :(得分:1)

apollo schema:download命令在服务器上运行an introspection query,并为您提供该查询的JSON结果。您不能使用此JSON并将其直接传递给GraphQLSchema构造函数- in the docs显示了初始化该类的正确方法。但是,您可以使用buildClientSchema函数,该函数:

  

给出客户端运行自省查询的结果,创建并返回一个GraphQLSchema实例,该实例随后可与所有GraphQL.js工具一起使用,但不能用于执行查询,因为自省并不代表“解析器” ,“解析”或“序列化”功能或任何其他服务器内部机制。

将它们放在一起:

const gql = require('graphql-tag)
const { validate, buildClientSchema } = require('graphql')
const schema = buildClientSchema(introspectionResult)
const document = gql`{
  someQuery
}`
const errorArray = validate(schema, document)