首页 > 解决方案 > 异步单元测试可能与 Mocha 中的测试数据库发生冲突

问题描述

我是 javascript 生态系统的新手,我正试图用一种体面的方式来围绕REST API 使用一组存储的固定装置(即文件)进行一些基本的单元测试。.json

我的入口点通过连接到测试数据库并发出ready状态来设置测试环境。

if (!process.env.TESTING) {
  /* Connect to MongoDB */
  connect(process.env.DEV_DB_HOST, process.env.DEV_DB, () => app.emit(ready));
  app.on(ready, () => {
    app.listen(port, () => console.log(`Listening on port ${port}!`));
  });
} else {
  connect(process.env.TEST_DB_HOST, process.env.TEST_DB, () => app.emit(ready));
}

export default app;

建立连接后,使用夹具在测试数据库中重新创建集合并执行测试。

import Paper from '../models/paper.js';

describe('Home Page', () => {
  before(async() => {
    await new Promise((resolve, reject) => {
      app.on(ready, () => resolve());
    }).then(async() => {
      try {
        await Paper.collection.drop();
      } catch(error) {
        /* Mongo throws an exception if the collection in question does not exist */
      }
      await Paper.create(fixtures);
    });
  });

  after(async() => {
    await Paper.collection.drop();
  });

  it('Returns a list of items ordered by date in descending order', async() => {
    const response = await chai.request(app).get('/');
    expect(response.body).to.have.lengthOf(2);
    expect(response.body).to.be.sortedBy("date", { descending: true });
  });
});

如果我用 and 替换andbefore钩子after,因为测试是,那么钩子是否有可能被执行以进行测试并在另一个使用该集合的测试完成执行之前转储该集合?如果是这样,为每个测试用例填充带有固定装置的测试数据库的好方法是什么?beforeEachafterEachasync

标签: node.jsunit-testingexpressmocha.js

解决方案


推荐阅读