2016-01-24 166 views
3

摩卡可以确定是否期望回调(done),或者它是否应该同步运行测试,仅基于您将回调作为参数传递。摩卡如何知道是异步?

// Sync 
it("should be amazing", function(){ 
    expect(amazing).equals(true); 
}); 

// Async 
it("should be amazing, eventually", function (done) { 
    setTimeout(function() { 
    expect(amazing).equals(true); 
    done(); 
    }, 1000); 
}); 

我不知道它是如何做到这一点的。我能想到的唯一方法是它将字符串解析为函数,并将其分解并确定是否传递参数。

这是怎么回事?

+0

它知道你是否已经定义为带有参数(比如'done')功能 – Whymarrh

+2

参见:http://stackoverflow.com/a/18422560/ 1267663 – Whymarrh

回答

4

你不会期望它,但函数有一个length财产!它等于函数所需的参数数量。

我会编辑答案,当我找到时,添加一个片段,但这是一种可以检测它是否接受参数的有效方法。检查长度是否为1,决定测试是否是异步测试。

编辑:I found it.对于上下文,it继承自Runnable

function Runnable(title, fn) { 
    // Other properties... 
    this.async = fn && fn.length; 
    // Other properties... 
} 
+0

不知道! – dthree

0

它使用回调中的字符串分析器或参数长度检查。

像这样的事情

function it(name, callback) { 

    if (callback.length > 0) { 
     callback(function done(e) { 
      if (e) throw "test finished with error" 
      //test finished 
     }) 

    } else { 
     callback() 
     //test finished 
    } 
} 
相关问题