Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 异步单元测试可能与Mocha中的测试数据库发生冲突_Node.js_Unit Testing_Express_Mocha.js - Fatal编程技术网

Node.js 异步单元测试可能与Mocha中的测试数据库发生冲突

Node.js 异步单元测试可能与Mocha中的测试数据库发生冲突,node.js,unit-testing,express,mocha.js,Node.js,Unit Testing,Express,Mocha.js,我是javascript生态系统的新手,我正在尝试一种体面的方法,使用存储的一组fixture(即.json文件)对RESTAPI进行一些基本的单元测试 我的入口点通过连接到测试数据库来设置测试环境,并发出ready状态 if (!process.env.TESTING) { /* Connect to MongoDB */ connect(process.env.DEV_DB_HOST, process.env.DEV_DB, () => app.emit(ready));

我是javascript生态系统的新手,我正在尝试一种体面的方法,使用存储的一组fixture(即
.json
文件)对RESTAPI进行一些基本的单元测试

我的入口点通过连接到测试数据库来设置测试环境,并发出
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;
建立连接后,使用fixture在测试数据库中重新创建集合并执行测试

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 });
  });
});

如果我将
之前
之后
钩子替换为
之前
之后
,因为测试是
异步的
,那么钩子是否可能在使用集合的另一个测试完成执行之前执行并转储集合?如果是这样,用每个测试用例的夹具填充测试数据库的好方法是什么?

可以说,单元测试不应该有任何副作用。单元测试基本上测试最小工作单元(即单个函数)的输入和输出,其中it依赖关系被模拟/存根。您所做的更多的是集成/api功能测试。对于测试数据,这取决于您是否希望为套件中的每个测试重用相同的集合(
descripe
block)。如果您希望在每次测试之前(
it
block)刷新数据集,那么
beforeach
beforeach
afterEach
是更好的方法,测试应该只在这些挂钩之后执行。在更好的情况下,集合不会从
it
块下删除,因为测试是
异步的
?如果一个
it
块保证在下一个块被激发之前运行到完成,那么这可以正常工作,但是如果它们并行运行,那么每个
之前的
it
块可能会激发一些
it
块,并从另一个
it
块下删除一个集合。这是正确的吗?可以这么说,单元测试不应该有任何副作用。单元测试基本上测试最小工作单元(即单个函数)的输入和输出,其中it依赖关系被模拟/存根。您所做的更多的是集成/api功能测试。对于测试数据,这取决于您是否希望为套件中的每个测试重用相同的集合(
descripe
block)。如果您希望在每次测试之前(
it
block)刷新数据集,那么
beforeach
beforeach
afterEach
是更好的方法,测试应该只在这些挂钩之后执行。在更好的情况下,集合不会从
it
块下删除,因为测试是
异步的
?如果一个
it
块保证在下一个块被激发之前运行到完成,那么这可以正常工作,但是如果它们并行运行,那么每个
之前的
it
块可能会激发一些
it
块,并从另一个
it
块下删除一个集合。这是正确的吗?