mocha:如何在after()中调用异步函数?

时间:2014-05-06 16:55:19

标签: mocha sails.js

我正在编写一个验证模型创建的测试,然后在描述之后,它会释放所有资源。

我的问题是'完成()'被称为不止一次,很明显为什么,但我怎样才能实现这样的功能并且只调用一次?这两个函数都是异步的!

测试结构和异步调用:

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是否为此提供了解决方案。 有什么想法吗?

1 个答案:

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

这是一般原则。