Использование mocha и chai для серверных модульных тестов, как очистить базу данных перед каждым тестом

#node.js #mongodb #express #testing #backend

#node.js #mongodb #экспресс #тестирование #серверная

Вопрос:

У меня есть серверная настройка с использованием Node.js , Express и MongoDB. Я написал два модульных теста для одной из своих конечных точек, но столкнулся с неожиданным поведением. Во-первых, вот код:

 let chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../../../server')
const expect = chai.expect
chai.use(chaiHttp);

describe('POST /user/register', () => {
  it('should create a new user', (done) => {
    chai
    .request(server)
    .post('/user/register')
    .send({username: 'Bob', password: 'password123'})
    .end((err, res) => {
      expect(res.status).to.equal(201)
      done()
    })
  })

  it('should result in an error if there is no payload', (done) => {
    chai
    .request(server)
    .post('/user/register')
    .send({})
    .end((err, res) => {
      expect(res.status).to.equal(500)
      done()
    })
  })
})
  

В should create a new user тесте он проходит с первой попытки, но завершается неудачей со 2-го, потому что пользователь сохраняется в базе данных, поэтому моя конечная точка возвращает код состояния 409, а не 201.

Я знаю, что мне нужно использовать beforeEach вызов для очистки тестовой базы данных, я просто не уверен в реализации после некоторого поиска.

Ответ №1:

Подход с beforeEach() правильным в вашем случае before() крючком был бы еще лучше. Вот официальная документация: https://mochajs.org/#hooks

Вы бы просто изменили свой код на это:

 let chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../../../server')
const expect = chai.expect
chai.use(chaiHttp);

describe('POST /user/register', () => {
  before(async () => {
    //This is sequelize syntax for postgres. You could just take your mongoose syntax here to delete all users
    await User.destroy({
      where: {},
      truncate: { cascade: true },
    })
  })
  it('should create a new user', (done) => {
    chai
    .request(server)
    .post('/user/register')
    .send({username: 'Bob', password: 'password123'})
    .end((err, res) => {
      expect(res.status).to.equal(201)
      done()
    })
  })

  it('should result in an error if there is no payload', (done) => {
    chai
    .request(server)
    .post('/user/register')
    .send({})
    .end((err, res) => {
      expect(res.status).to.equal(500)
      done()
    })
  })
})  

Комментарии:

1. Спасибо, мне пришлось лишь внести незначительные изменения в ваше решение, чтобы оно заработало: before(async () => { await User.deleteMany({}) })