2016-01-24 165 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 
    } 
} 
相關問題