通过CircleCI部署Express服务器并测试GraphQL API

时间:2019-07-23 13:41:24

标签: node.js express continuous-integration circleci circleci-2.0

我希望测试Express服务器是否正常启动,并且我的端点检索正确的信息。我希望在CI中执行此操作,以便将来进行任何更改时可以监视应用程序何时不再运行。

这是一个非常简单的应用程序,我的服务器如下所示:

server.js

import express from 'express';
import graphqlHTTP from 'express-graphql';
import { GraphQLObjectType, GraphQLString, GraphQLSchema } from 'graphql';
import cors from 'cors';

const QueryRoot = new GraphQLObjectType({
    name: 'Query',
    fields: () => ({
        hello: {
            type: GraphQLString,
            resolve: () => "Hello world!"
        }
    })
});

const schema = new GraphQLSchema({ query: QueryRoot });

const app = express();

app.use(cors()); // enable cors

app.use('/api', graphqlHTTP({
    schema: schema,
    graphiql: true,
}));

app.listen(1337, () => {
    console.log('Server running on port: 1337');
});

basicTest.test.js

const chai = require('chai');

const expect = chai.expect;
const url = `http://localhost:1337`;
const request = require('supertest')(url);

describe('GraphQL', () => {
    it('Response returns hello world', (done) => {
        request.post('/api')
            .send({ query: ' { hello }' })
            .expect(200)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body.data.hello).to.contain('Hello world!');
                done();
            });
    });
});

我的.circleci/config.yml如下:

# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/node:10.16.0

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/mongo:3.4.4

    working_directory: ~/repo

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "package.json" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run: npm install

      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}

      - run: 
          npm start &
          npm test

package.json

{
    "name": "graphql-express-server",
    "repository": {
        "url": "myURL"
    },
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "start": "nodemon -r esm server.js",
        "test": "mocha test/*.test.js"
    },
    "author": "AuthorName",
    "license": "ISC",
    "dependencies": {
        "cors": "^2.8.5",
        "esm": "^3.2.25",
        "express": "^4.17.1",
        "express-graphql": "^0.9.0",
        "graphql": "^14.4.2",
        "nodemon": "^1.19.1",
        "supertest": "^4.0.2"
    },
    "devDependencies": {
        "chai": "^4.2.0",
        "mocha": "^6.2.0"
    }
}

我尝试在&命令的末尾添加npm start,但据我所知,这只是跳过了整个过程。执行测试时,我遇到的问题是'Error: ECONNREFUSED: Connection refused'

我需要在其他地方托管服务器吗?我不确定该怎么办。我以前从未真正测试过CI的后端。

编辑:

我的命令如下:

- run: 
    npm start &
- run:
    sleep 5
- run: 
    npm test

我在CI中的输出如下:

--------------------------------
***npm start &***

#!/bin/bash -eo pipefail
npm start &

--------------------------------
***sleep 5***

#!/bin/bash -eo pipefail
sleep 5

--------------------------------
***npm test***

#!/bin/bash -eo pipefail
npm test

> graphql-express-server@1.0.0 test /home/circleci/repo
> mocha test/*.test.js



  GraphQL
    1) Response returns hello world


  0 passing (14ms)
  1 failing

  1) GraphQL
       Response returns hello world:
     Error: ECONNREFUSED: Connection refused
      at Test.assert (node_modules/supertest/lib/test.js:165:15)
      at localAssert (node_modules/supertest/lib/test.js:131:12)
      at /home/circleci/repo/node_modules/supertest/lib/test.js:128:5
      at Test.Request.callback (node_modules/superagent/lib/node/index.js:728:3)
      at ClientRequest.req.once.err (node_modules/superagent/lib/node/index.js:647:10)
      at Socket.socketErrorListener (_http_client.js:392:9)
      at emitErrorNT (internal/streams/destroy.js:91:8)
      at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
      at process._tickCallback (internal/process/next_tick.js:63:19)



npm ERR! Test failed.  See above for more details.
Exited with code 1

--------------------------------

如您所见,消息Server running on port: 1337没有显示在我的npm start &步骤控制台部分。

有什么建议吗?我在做错什么吗?

1 个答案:

答案 0 :(得分:1)

npm start &不会等待服务器启动,您确定在测试发出请求时,服务器正在侦听该端口吗?即您在CI的控制台中是否有'Server running on port: 1337'?如果没有,请尝试运行sleep 3,然后再开始测试