我正在编写一个验证模型创建的测试,然后在描述之后,它会释放所有资源。
我的问题是'完成()'被称为不止一次,很明显为什么,但我怎样才能实现这样的功能并且只调用一次?这两个函数都是异步的!
测试结构和异步调用:
describe('create models', function() {
it('...', function(done) {...});
});
after(function(done) {
dbDestroyCenter('param1','param2')(done);
dbDestroyCenter('param1','param2')(done);
});
删除功能:
function dbDestroyCenter(centerState, centerName) {
return function (done) {
State.findOne({ name: centerState }).exec(function (err, state) {
if (err) return done(err);
expect(state).not.to.be.an('undefined');
Center.destroy({ state: state.id, name: centerName }).exec(function(err) {
if (err) return done(err);
return done();
});
});
};
}
一种可能性是使用来自https://github.com/caolan/async的async.parallel,但我不确定Mocha是否为此提供了解决方案。 有什么想法吗?
答案 0 :(得分:2)
将您自己的回调传递给dbDestroyCenter
函数返回的函数并保持计数。一旦你被称为你期望的次数,你就完成了,并且可以致电done
。
after(function(done) {
// Initialize to the number of things to destroy.
var to_destroy = 2;
function destroyed(err) {
// Terminate immediately if there's an error.
if (err)
done(err);
// If there's nothing left to destroy, then call done().
if (!--to_destroy)
done();
}
dbDestroyCenter('param1','param2')(destroyed);
dbDestroyCenter('param1','param2')(destroyed);
});
这是一般原则。