当我使用Mocha进行测试时,我经常需要运行异步和同步测试的组合。
Mocha处理这个很漂亮,允许我在我的测试是异步的时候指定一个回调函数done
。
我的问题是,Mocha如何在内部观察我的测试并知道它应该等待异步活动?它似乎等待我的测试函数中定义的回调参数。您可以在下面的示例中看到,第一个测试应该超时,第二个应该在user.save
调用匿名函数之前继续并完成。
// In an async test that doesn't call done, mocha will timeout.
describe('User', function(){
describe('#save()', function(){
it('should save without error', function(done){
var user = new User('Luna');
user.save(function(err){
if (err) throw err;
});
})
})
})
// The same test without done will proceed without timing out.
describe('User', function(){
describe('#save()', function(){
it('should save without error', function(){
var user = new User('Luna');
user.save(function(err){
if (err) throw err;
});
})
})
})
这个node.js是特定的魔法吗?这可以在任何Javascript中完成吗?
答案 0 :(得分:20)
这是简单纯粹的Javascript魔法。
函数实际上是对象,它们具有属性(例如参数的数量是用函数定义的)。
看看在mocha / lib / runnable.js
中如何设置this.asyncfunction Runnable(title, fn) {
this.title = title;
this.fn = fn;
this.async = fn && fn.length;
this.sync = ! this.async;
this._timeout = 2000;
this._slow = 75;
this.timedOut = false;
}
Mocha的逻辑根据您的函数是否使用参数定义而发生变化。
答案 1 :(得分:4)
你正在寻找的是函数的长度属性,它可以告诉函数期望的参数数量。当您使用done
定义回调时,它可以异步地判断和处理它。
function it(str, cb){
if(cb.length > 0)
//async
else
//sync
}
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/Length