Node.js 异步单元测试可能与Mocha中的测试数据库发生冲突
我是javascript生态系统的新手,我正在尝试一种体面的方法,使用存储的一组fixture(即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));
.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
块下删除一个集合。这是正确的吗?