Node.js - 使用 supertest 测试 REST API 路由

Node.js - Testing REST API routes with supertest

Req.body 在发出 post 请求时无法在路由中访问。如果 he/she 帮助我度过难关,我将不胜感激。这是我的 microservice.test.js 文件的屏幕截图。我错过了什么吗?

import request from "supertest";
import mongoose from "mongoose";

import config from "../config/env";
import routes from "../server/routes";

import { parseResponse, doRequest } from "../server/utils/helperFunctions";

const app = express();
app.use("/", routes);

jest.setTimeout(30000);

expressjs 4以下版本包含body解析中间件

import bodyParser from 'body-parser';
app.use(bodyParser());

示例测试

it('.post should work with data', function (done) {
    var app = express();

    app.use(bodyParser());

    app.post('/', function(req, res){
      res.send(req.body.name);
    });

    request(app)
    .post('/')
    .send({ name: 'tobi' })
    .expect('tobi', done);
  })

所提供的代码没有提供太多见解,因为我希望请求的所有处理都在您的路由处理程序中。 运行 与 supertest 测试时无法访问正文的问题吗?或者它根本不起作用。更多信息将非常有帮助。

如果是 supertest 问题,我建议您查看 the docs for good examples。这是我直接从 NPM 站点提取的一个,他们 POST 一些带有请求正文的数据,然后验证响应正文:

describe('POST /user', function() {
  it('user.name should be an case-insensitive match for "john"', function(done) {
    request(app)
      .post('/user')
      .send('name=john') // x-www-form-urlencoded upload
      .set('Accept', 'application/json')
      .expect(function(res) {
        res.body.id = 'some fixed id';
        res.body.name = res.body.name.toLowerCase();
      })
      .expect(200, {
        id: 'some fixed id',
        name: 'john'
      }, done);
  });
});

另外,如果您正在尝试测试您的服务器,您应该导入您的服务器代码,而不是创建一个新的 express 实例。例如,在您的服务器代码中,您将拥有如下内容:

server.js

const express = require('express');

const app = express();
app.use('/', ...) // middleware/route config
...

module.exports = app;

您的服务器将像这样使用此服务器:

index.js

const app = require('./server')
const port = 4000

app.listen({ port }, () => {
  const location = `http://localhost:${port}`
  logger.info(` Server ready at ${location}`)
})

module.exports = app

现在您已经按照这种方式构建了代码,在您的测试中您也可以导入您的服务器(因此您正在测试您的实际服务器,而不是您创建的新服务器):

server.test.js

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

describe('Server', () => {
  it('does a thing', async () => {
    const { body } = await request
      .post('http://path/to/test')
      .send({ data: 'some data' })
      .set('Content-Type', 'application/json')
      .set('Accept', 'application/json')
      .expect(200);

    expect(body.thing).toBeTrue();
  });
});