Тестирование REST API-маршрутов с помощью supertest - PullRequest
0 голосов
/ 15 января 2020

Req.body не доступен в маршрутах при отправке запроса. Было бы очень признательно, если бы кто-то помог мне пройти через это. Вот скриншот моего файла 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);

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Приведенный код не дает большого понимания, так как я ожидаю, что вся обработка запроса будет в вашем обработчике маршрута. Проблема в том, что вы не можете получить доступ к телу при выполнении тестов с supertest? Или что это не работает вообще. Дополнительная информация была бы очень полезна.

Если это проблема supertest, я бы рекомендовал проверить документы для хороших примеров . Вот что я извлек прямо с сайта NPM, где они ПОСТАВЛЯЮТ некоторые данные с телом запроса, а затем проверяют тело ответа:

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();
  });
});

0 голосов
/ 15 января 2020

expressjs версия ниже 4, включает промежуточное ПО для разбора тела

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);
  })
...