使用Graphql Apollo Server进行graphql-tester(单元测试)

问题描述 投票:3回答:4

如何为graphql编写单元测试。我正在使用apollo服务器,graphql-tester和graphql。

当我运行测试时,它会出现以下错误


    { raw: '{"errors":[{"message":"Cannot read property \'definitions\' of undefined"}]}',
      data: undefined,
      errors: [ { message: 'Cannot read property \'definitions\' of undefined' } ],
      headers: 
       { 'x-powered-by': 'Express',
         'content-type': 'application/json',
         date: 'Wed, 18 Jan 2017 05:56:22 GMT',
         connection: 'close',
         'transfer-encoding': 'chunked' },
      status: 400,
      success: false }
          1) Returns success


      0 passing (35ms)
      1 failing

      1) Unittest1 Returns success:
         TypeError: Cannot read property 'success' of undefined
          at Assertion. (node_modules/chai/lib/chai/core/assertions.js:890:14)
          at Assertion.ctx.(anonymous function) (node_modules/chai/lib/chai/utils/addMethod.js:41:25)
          at Assertion.somethingMethod (node_modules/chai-things/lib/chai-things.js:97:25)
          at Assertion.ctx.(anonymous function) (node_modules/chai/lib/chai/utils/overwriteMethod.js:49:33)
          at Assertion.allMethod (node_modules/chai-things/lib/chai-things.js:165:25)
          at Assertion.ctx.(anonymous function) (node_modules/chai/lib/chai/utils/overwriteMethod.js:49:33)
          at node_modules/chai-as-promised/lib/chai-as-promised.js:305:22
          at process._tickCallback (internal/process/next_tick.js:103:7)

以下是单元测试。


    const tester = require('graphql-tester').tester;
    const fromGlobalId = require('graphql-relay').fromGlobalId;

    const chai = require('chai');

    chai.should();
    chai.use(require('chai-things'));
    chai.use(require('chai-properties'));
    chai.use(require('chai-arrays'));
    chai.use(require('chai-as-promised'));

    describe('Sites', () => {
      let sitesTest = tester({
        url: 'http://localhost:3000/graphql'
      });

      describe('Unittest1', () => {
        const response = sitesTest('{viewer {id}}').then((data) => {
          console.log(data)
        });

        it('Returns success', () => {
          return response.should.eventually.have.property('success').equal(true);
        });

      });

    });

graphql apollo-server apollo-client
4个回答
5
投票

以下是我如何使用它:

const gql = tester({
  server: createExpressWrapper(server),
  url: '/graphql',
  authorization: `Bearer ${token}`,
  contentType: 'application/json'
})

gql(JSON.stringify({ query: '{ users { id } }' })).then((data) => {

})

Apollo的graphql server希望将内容类型设置为application/json,其有效负载为{ query: "...", variables: {}}


0
投票

也许您可以使用easygraphql-tester,使用此包,您可以针对您的架构测试查询/突变/订阅。它可以用于返回模拟或断言包,因此在您的情况下,您可以执行以下操作:

const EasyGraphQLTester = require('easygraphql-tester')

const tester = new EasyGraphQLTester(schema)
const query = `
  {
    viewer {
      id
    }
  }
`
const mock = tester.mock({ query })

然后你可以测试模拟的结果......或者,你也可以在那里设置灯具!


0
投票

graphql-tester无关,但是Apollo-Server的替代品。也许有帮助。

我发现使用apollo-server-testing编写集成测试非常舒服。它将为apollo-server实例创建一个测试客户端,该实例不需要运行服务器。

import { ApolloServer } from 'apollo-server';
import { createTestClient } from 'apollo-server-testing';

const prepareServer = async () => {
  // creating your real schema
  const schema = await Schemas.getSchemas();
  return new ApolloServer({
    schema,
    dataSources: () => ({
      data: new MockDatasource(), // provides mocked data
    }),
  });
};

it('test query', async () => {
  const server = await prepareServer();
  const { query } = createTestClient(server);

  const result = await query({ query: QUERY_GQL });
  // test result data
});

阿波罗页面上更详细的例子:https://www.apollographql.com/docs/apollo-server/features/testing.html


-1
投票

你确定GraphQL API正在运行吗?通常,最好让测试套件为您启动测试服务器,这样您就可以在没有外部依赖性的情况下运行测试。我将一个包装好的快递服务器和一个相对网址传递给graphql-tester

例如,

const expressApp = initApp();
const client = tester({
  server: createExpressWrapper(expressApp),
  url: '/graphql',
});

假设initApp()确实返回了一个在/ graphql端点运行GraphQL API的快速应用程序,我相信它应该适合你。

作为参考,这里是createExpressWrapper的实现。 https://github.com/sazzer/graphql-tester/blob/master/src/main/servers/express.js

© www.soinside.com 2019 - 2024. All rights reserved.