Клиент Apollo ECONNREFUSED при тестировании API-интерфейса graphql со стороны сервера - PullRequest
0 голосов
/ 06 сентября 2018

Вот так я тестирую свой GraphQL API. Я использую Mocha для своего теста, в начале теста я запускаю свои apollo server и initialize database, затем я сканирую тестовые файлы, чтобы добавить их в mocha, затем запускаю его. После этого я закрываю сервер и базу данных.

Чтобы понять это лучше, вот подробности

// folder structure - graphql-server
// there are src/, config/ and other stuff but only show tests directory tree
.
..
tests/
  unit_tests/
    mutation/
      user.test.js
    query/
      hello.test.js
    index.test.js // where tests are setup
  utils/
    apolloClient.js // The Apollo Client
    scanTestsAt.js // get path to test files to add to mocha
    testConfig.js  // just some config like graphql endpoint, server port, etc

Коды настройки теста

// index.test.js
import ...

describe('Unit tests', function() {
  const mocha = new Mocha({ useColors: true, fullStackTrace: true });
  let server = null;

  before(function () {
    return new Promise(function(resolve) {
      db
        .sequelize
        .sync({ force: true, match: /_test$/ })
        .then(function () {
          server = app.listen({ port: config.testServerPort }, function () {
            resolve();
          });
        });
    });
  });

  ['mutation', 'query'].forEach(function(dirName) {
    scanTestAt(`tests/unit_tests/${dirName}`, mocha);
  });

  it('=======UnitTesting=======', function() {
    mocha.run();
  });

  after(function() {
    db.sequelize.close();
    server.close();
  });
});

Клиентские коды Apollo

// tests/utils/apolloClient.js

import { ApolloClient } from 'apollo-client';
import { HttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';
import fetch from 'node-fetch';

import config from './testConfig';

const link = new HttpLink({
  uri: `http://localhost:${config.testServerPort}/${config.graphqlEndpoint}`,
  fetch
});

const cache = new InMemoryCache();

const client = new ApolloClient({ link, cache });

export default client;

Один очень простой код запроса, чтобы убедиться, что мы настроили основное право

// tests/unit_tests/query/hello.test.js

import { expect, should } from 'chai';
import { describe, it } from 'mocha';
import { gql } from 'apollo-server-express';

import client from '../../utils/apolloClient';

describe('hello query', function() {
  it('should return Hello World to ensure graphql server is working at the basic', async function() {
    const query = gql`{ hello }`;

    const { data } = await client.query({ query });

    expect(data.hello).to.equal('Hello World');
  });
});

Ошибка:

// NOTE: I used '~' to hide the path here, but it is actually full path

Error: Network error: request to http://localhost:3000/graphql failed, reason: connect ECONNREFUSED 127.0.0.1:3000
  at new ApolloError (~/projects/connect-apollo-postgres-boilerplate/node_modules/src/errors/ApolloError.ts:56:5)
  at Object.error (~/projects/connect-apollo-postgres-boilerplate/node_modules/src/core/QueryManager.ts:300:13)
  at notifySubscription (~/projects/connect-apollo-postgres-boilerplate/node_modules/zen-observable/lib/Observable.js:130:18)
  at onNotify (~/projects/connect-apollo-postgres-boilerplate/node_modules/zen-observable/lib/Observable.js:161:3)
  at SubscriptionObserver.error (~/projects/connect-apollo-postgres-boilerplate/node_modules/zen-observable/lib/Observable.js:220:7)
  at ~/projects/connect-apollo-postgres-boilerplate/node_modules/apollo-link-http/src/httpLink.ts:163:20
  at process._tickCallback (internal/process/next_tick.js:68:7)

Однако, когда я запускаю сервер снаружи, закомментирую код до и после и запускаю тест на другом терминале, все мои тесты выполняются успешно.

Кроме того, если я вместо этого запускаю тест в том же index.test.js, он также успешно запускается, например:

// index.test.js

...
before(function() { ...same codes });

// ...everything same
// except this
it('=======UnitTesting=======', function() {
  // mocha.run(); comment this out and copy all the codes from hello.test.js and user.test.js (contains basic signup and login test)

  // copy paste codes...
  // all test run successfully
});


after(function() { ...same codes });

ТАК как исправить ошибку, из-за которой клиент apollo отказывается подключаться к http://localhost:3000/graphql

РЕДАКТИРОВАТЬ 1: Так я запускаю тест

// package.json

...
"scripts": {
  ...
  "unit-test": "NODE_ENV=test NODE_PATH=./ mocha --recursive --require @babel/register -- tests/unit_tests/index.test.js"
},
...

// outside on the terminal, at the server root directory
npm run unit-test

РЕДАКТИРОВАТЬ 2: Вместо того, чтобы использовать Apollo Client, я сейчас использую только graphql для проверки моих resolvers и subscriptions, поэтому эта проблема будет считаться закрытой для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...