Вот так я тестирую свой 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
, поэтому эта проблема будет считаться закрытой для меня.