超级测试:如何为 API 端点编写测试并发布到另一个 API 端点?

Supertest: How to write tests for API endpoint which posts to another API endpoint?

我正在使用超级测试来测试我的 API 端点。我对一个端点执行 post,对另一个端点执行另一个 post,即使端点已实现,我也会收到 404 错误。这是因为我在超测试使用的 server 中没有做 listen() 并且因为超测试在测试中不知道这个端点,所以我得到 404 似乎是合乎逻辑的。做 listen 不是一个明智的选择,因为我在多个文件中进行了多次测试,我不想遇到 address already in use error

解决此问题的一种方法是在 运行 测试之前将另一台服务器作为 pretest 启动,以便端点在测试期间可用,但应该有更好的方法。

这是我的服务器

// server.js
const express = require('express')
const app = express()

// Middlewares...
// Routes...
post(/abc) // abc posts to def during the test
post(/def)

module.exports = app

这是start.js,与测试无关,只是听听,我将其用于本地手动测试

// start.js
const app = require('./server.js')
app.listen(3000)

解决方法如下:

server.js:

const express = require('express');
const request = require('request-promise');
const app = express();

app.post('/abc', async (req, res) => {
  const url = req.protocol + '://' + req.get('host');
  const rval = await request.post(`${url}/def`);
  res.send(rval);
});
app.post('/def', (req, res) => {
  res.send('def');
});

module.exports = app;

start.js:

const app = require('./server.js');
const s = app.listen(3000, () => {
  console.log(`HTTP server is listening on http://localhost:${s.address().port}`);
});

server.test.js:

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

describe('server', () => {
  it('should pass', (done) => {
    supertest(app)
      .post('/abc')
      .expect(200)
      .end((err, res) => {
        if (err) throw err;
        expect(res.text).toBe('def');
        done();
      });
  });
});

集成测试结果与覆盖率报告:

 PASS  src/Whosebug/59090082/server.test.js
  server
    ✓ should pass (54ms)

-----------|----------|----------|----------|----------|-------------------|
File       |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-----------|----------|----------|----------|----------|-------------------|
All files  |      100 |      100 |      100 |      100 |                   |
 server.js |      100 |      100 |      100 |      100 |                   |
-----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.208s, estimated 13s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/Whosebug/59090082