【问题标题】:Using mocha and chai for backend unit tests, how to clear the database before each test使用mocha和chai进行后端单元测试,每次测试前如何清库
【发布时间】:2020-11-03 02:29:06
【问题描述】:

我有一个使用 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 测试中,第一次尝试通过,但第二次失败,因为用户被持久化在数据库中,所以我的端点返回 409 状态码,而不是 201。

我知道我必须使用beforeEach 调用来清除测试数据库,我只是在搜索了一段时间后不确定实现。

【问题讨论】:

    标签: node.js mongodb express testing backend


    【解决方案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()
        })
      })
    })

    【讨论】:

    • 谢谢,我只需要对您的解决方案进行微调即可使其正常工作: before(async () => { await User.deleteMany({}) })
    猜你喜欢
    • 2017-02-18
    • 2014-11-25
    • 2021-09-27
    • 1970-01-01
    • 2019-11-26
    • 2018-01-02
    • 1970-01-01
    • 2019-02-14
    • 2021-09-14
    相关资源
    最近更新 更多