超测无法测试重复的 post 请求

Supertest fails to test repeated post request

我正在测试创建用户的 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);
  });
});

第一次测试有效,但第二次测试returns出现以下错误:

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

我手动进行了测试,api 工作正常(返回 400 状态代码)。

这次测试我哪里出错了?

所以看起来你的 beforeEach 在每个单独的测试之前被调用。因此,在您添加第一个用户后,您的 table 变为 reset/reseeded。也许尝试将您的填充用户放在 before() 中,这样它只会发生一次。我不是 100% 确定,但如果这对你有用,请告诉我。

例如,如果您完全删除了 beforeEach(),如果这没有达到您的期望,我会感到非常惊讶。

这是因为您 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 使用 before 而不是 beforeEach 来播种

它会在所有测试前运行一次

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