繁体   English   中英

在 NodeJS 中使用 Express 和 Supertest 运行集成测试时如何创建/关闭服务器

[英]How to create/close the server when running integration tests using Express and Supertest in NodeJS

我的问题是我在运行测试时总是收到“ Address already in use::3000 ”错误。

这是我所拥有的:

package.json

"scripts": {
    "test": "jest --watchAll --verbose --runInBand --maxWorkers=1"
 },

服务器.js

const winston = require('winston');
const express = require('express');
const app = express();

module.exports = function() {
    const port = process.env.PORT || 3000;

    return app.listen(port, () => { winston.info(`Listening on port ${port}...`) });
}

auth.test.js(仅显示一项测试)

describe('auth middleware', () => {
    beforeEach(() => { server = require('../../startup/server'); });
    afterEach(async () => { 
        await Category.remove({});
        await server.close(); 
    });

    let token;

    const exec = () => {
        return request(server)
            .post('/api/categories')
            .set('x-auth-token', token)
            .send({ name: 'category1' });
    }

    beforeEach(() => {
        token = new User().generateAuthToken();
    });

    it('should return 200 if token is valid', async () => {
        const res = await exec();

        expect(res.status).toBe(200);
    });
});

我不确定我做错了什么,stackoverflow 上的大多数答案都指向将runInBandmaxWorkers=1添加到package.json或等待server.close() 没有什么对我有用。

PS:我之前在一次测试中遇到过这个问题,但是在将服务器逻辑提取到单独的文件(来自index.js )之后,现在所有测试都因这个错误而失败,所以很明显我遗漏了一些东西。
而且我没有运行应用程序,只是我的测试。

这是一个最小的工作示例:

server.js

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = process.env.PORT || 3000;

app.use(bodyParser.json());
app.post('/api/categories', (req, res) => {
  console.log(req.body);
  res.sendStatus(200);
});

if (require.main === module) {
  app.listen(port, () => {
    console.info(`Listening on port ${port}...`);
  });
}

module.exports = app;

auth.test.js

const request = require('supertest');
const server = require('./server');

describe('auth middleware', () => {
  const exec = () => {
    return request(server)
      .post('/api/categories')
      .set('x-auth-token', 'token')
      .send({ name: 'category1' });
  };
  it('should return 200 if token is valid', async () => {
    const res = await exec();
    expect(res.status).toBe(200);
  });
});

集成测试结果:

 PASS  src/stackoverflow/58569731/auth.test.js (8.919s)
  auth middleware
    ✓ should return 200 if token is valid (70ms)

  console.log src/stackoverflow/58569731/server.js:8
    { name: 'category1' }

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        9.993s, estimated 10s

启动 HTTP web 服务器:

 node /Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58569731/server.js       
Listening on port 3000...

npm scripts

"test": "jest --detectOpenHandles --verbose",

源码: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58569731

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM