Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mocha如何知道只在异步测试中等待和超时?_Node.js_Mocha.js - Fatal编程技术网

Node.js Mocha如何知道只在异步测试中等待和超时?

Node.js Mocha如何知道只在异步测试中等待和超时?,node.js,mocha.js,Node.js,Mocha.js,当我使用Mocha进行测试时,我通常需要同时运行异步和同步测试 Mocha很好地处理了这个问题,每当我的测试是异步的,它允许我指定一个回调,done 我的问题是,Mocha如何在内部观察我的测试并知道它应该等待异步活动?它似乎会在测试函数中定义回调参数的任何时候等待。您可以在下面的示例中看到,第一个测试应该超时,第二个测试应该在user.save调用匿名函数之前继续并完成 // In an async test that doesn't call done, mocha will timeout

当我使用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中都可以实现吗?

您要查找的是函数的length属性,它可以告诉函数需要多少参数。当您使用
done
定义回调时,它可以判断并异步处理回调

function it(str, cb){
  if(cb.length > 0)
    //async
  else
    //sync
}

这是一个简单的纯Javascript魔术

函数实际上是对象,并且它们具有属性(例如使用函数定义的参数数量)

看看在mocha/lib/runnable.js中如何设置this.async

function 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的逻辑根据您的函数是否定义了参数而改变。

谢谢,看起来已经完成了。参考示例,
var fn1=function(){};assert.equal(fn1.length,0);var fn2=函数(param){};assert.equal(fn2.length,1)
这是正确的,并提供了确切的示例。查看下面George的答案,查看有关函数长度函数的文档。