如何在 Mocha 测试框架内按顺序同步调用异步函数?
How can I synchronously call asynchronous functions sequentially within the Mocha Test Framework?
请不要建议模拟数据库模型,因为这不是我可用的选项,我知道这是一种更好的测试方法。
我有几个必须按以下顺序创建的数据库模型:
A -> B -> C -> D
我正在使用 Sequelize 和 Mocha 测试框架。我想在我的测试数据库中创建这些模型作为测试设置的一部分。
describe('My Tests', () => {
before(done => {
models.aModel.create({ name: 'A'}).then((a) => { done(); });
models.bModel.create({ name: 'B'}).then((b) => { done(); });
models.cModel.create({ name: 'C'}).then((c) => { done(); });
models.dModel.create({ name: 'D'}).then((d) => { done(); });
});
});
很明显这是行不通的。在伪代码中,我想做的是:
describe('My Tests', () => {
before(done => {
await creation of a
await creation of b
await creation of c
await creation of d
});
});
我该怎么做?
您可以简单地链接调用:
describe('My Tests', () => {
before(done => {
models.aModel.create({ name: 'A'})
.then(() => models.bModel.create({ name: 'B'}))
.then(() => models.cModel.create({ name: 'C'}))
.then(() => models.dModel.create({ name: 'D'}))
.then(() => { done(); });
});
});
function f(str) {
console.log('Started: ' + str);
return new Promise(resolve => { console.log('finished: ' + str); resolve(); });
}
f('a')
.then(() => f('b'))
.then(() => f('c'))
.then(() => f('d'))
.then(() => { console.log('done'); });
尝试这样的事情:
before(async function () {
await models.aModel.create({ name: 'A'});
await models.bModel.create({ name: 'B'});
await models.cModel.create({ name: 'C'});
await models.dModel.create({ name: 'D'});
})
在异步函数中,您可以等待解决承诺。
请不要建议模拟数据库模型,因为这不是我可用的选项,我知道这是一种更好的测试方法。
我有几个必须按以下顺序创建的数据库模型:
A -> B -> C -> D
我正在使用 Sequelize 和 Mocha 测试框架。我想在我的测试数据库中创建这些模型作为测试设置的一部分。
describe('My Tests', () => {
before(done => {
models.aModel.create({ name: 'A'}).then((a) => { done(); });
models.bModel.create({ name: 'B'}).then((b) => { done(); });
models.cModel.create({ name: 'C'}).then((c) => { done(); });
models.dModel.create({ name: 'D'}).then((d) => { done(); });
});
});
很明显这是行不通的。在伪代码中,我想做的是:
describe('My Tests', () => {
before(done => {
await creation of a
await creation of b
await creation of c
await creation of d
});
});
我该怎么做?
您可以简单地链接调用:
describe('My Tests', () => {
before(done => {
models.aModel.create({ name: 'A'})
.then(() => models.bModel.create({ name: 'B'}))
.then(() => models.cModel.create({ name: 'C'}))
.then(() => models.dModel.create({ name: 'D'}))
.then(() => { done(); });
});
});
function f(str) {
console.log('Started: ' + str);
return new Promise(resolve => { console.log('finished: ' + str); resolve(); });
}
f('a')
.then(() => f('b'))
.then(() => f('c'))
.then(() => f('d'))
.then(() => { console.log('done'); });
尝试这样的事情:
before(async function () {
await models.aModel.create({ name: 'A'});
await models.bModel.create({ name: 'B'});
await models.cModel.create({ name: 'C'});
await models.dModel.create({ name: 'D'});
})
在异步函数中,您可以等待解决承诺。