Supertest не может проверить повторный почтовый запрос - PullRequest
0 голосов
/ 14 сентября 2018

Я тестирую API, который создает пользователей. API не позволяет создавать пользователей с одинаковым значением входа в систему. Итак, я написал тесты ниже:

const app = require('../config/express'); //exports a configured express app
const request = require('supertest');
const {populateUsers} = require('../seeders/users.seed');

beforeEach(populateUsers);//drop and populate database with some seeders

describe('POST /v1/users', () => {
  it('#Post a new user - 201 status code', (done) => {
    request(app)
        .post('/v1/users')
        .send({
                login:'user-teste-01',
                password: 'pass01'
        }).expect(201, done);           
  });
  it('#Post repeated login - 400 status code', (done) => {
    request(app)
        .post('/v1/users')
        .send({
                login:'user-teste-01',
                password: 'pass01'
        }).expect(400, done);
  });
});

Первый тест работает, но второй тест возвращает следующую ошибку:

Error: expected 400 "Bad Request", got 201 "Created"

Я сделал тесты вручную, и API работает правильно (возвращает код состояния 400).

Где я допустил ошибку в этом тесте?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

это потому, что у вас есть beforeEach, который сбрасывает вашу базу данных.Этот хук будет выполняться в каждом тесте, поэтому в вашем 400 status code у вас больше нет пользователя user-teste-01, поскольку он был сброшен с помощью beforeEach.

Для этого есть несколько решений:

# 1 Используйте логин и пароль, которые существуют в вашем семени

it('#Post repeated login - 400 status code', (done) => {
  request(app)
    .post('/v1/users')
    .send({
      login: 'user-exist-in-seed',
      password: 'pass01'
    }).expect(400, done);
});

# 2Снова создайте пользователя перед запуском сценария

context('when user is already exist', function() {
  beforeEach(function() {
    // create a user `user-teste-01`
    // use beforeEach so it will be executed after seeding
  })

  it('#Post repeated login - 400 status code', (done) => {
    request(app)
      .post('/v1/users')
      .send({
        login: 'user-teste-01',
        password: 'pass01'
      }).expect(400, done);
  });
});

3 Используйте перед вместо beforeEach для заполнения

Он будет запущен один раздо всех испытаний

before(populateUsers);//drop and populate database with some seeders
0 голосов
/ 20 сентября 2018

Таким образом, похоже, что ваш beforeEach вызывается перед каждым отдельным тестом. Таким образом, ваша таблица сбрасывается / перезапускается после добавления первого пользователя. Возможно, вместо этого попробуйте поместить ваших заполненных пользователей в before (), чтобы это происходило только один раз. Я не уверен на 100%, но дайте мне знать, если это работает для вас.

Я был бы очень удивлен, если бы это не сделало то, что вы ожидаете, если, например, вы полностью удалили beforeEach ().

...