#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({}) })