2013-05-03 50 views
3

異步測試如何在Intern測試框架中工作?我試圖讓它們完全按照示例運行,但異步測試立即通過,而不等待回調被運行。異步測試如何在實習生中工作?

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.callback(function(result) { 
     expect(result).to.... something 
    })); 
} 

測試立即通過。我究竟做錯了什麼?

+0

也許測試通過,因爲回調_is_被稱爲預期和您的回調內的斷言恰好通過?我猜你已經證實回調沒有被調用。只是一個想法。 – bitpshr 2013-05-03 00:55:46

+0

那麼,'conn.connect'必須執行異步請求,但是在任何XMLHttpRequest發生之前觸發回調。 – 2013-05-03 01:00:59

+0

那麼,我已經想出了即使在連接建立之前觸發回調。但是,'result'變量保存狀態,我只有在狀態等於某個值時才需要檢查它。我可以說'這不是我的情況,當你打另一個結果時再次打電話'嗎? – 2013-05-03 01:04:38

回答

5

dfd.callback直到執行它本身才執行任何操作。請記住,它是爲promise回調(即傳遞給promise.then的函數)設計的,而不是參數可能爲錯誤的Node.js樣式回調(即function (error, result) {})。它不會檢查是否有錯誤作爲參數傳遞。

不知道conn是什麼,但看到你如何將dfd.callback作爲參數傳遞給非承諾的東西,我懷疑你是在嘗試使用Node.js樣式的回調函數,並且調用立即出錯。我們可能會爲這些類型的回調的簡便包裝在未來將其轉換爲一個承諾接口,但在那之前,你可能只需要做這樣的事情:

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.callback(function(error, result) { 
     if (error) { 
      throw error; 
     } 

     expect(result).to.... something 
    })); 
}); 

否則,不知道什麼conn是並看到你的實際主張是什麼,這很難說出問題在這裏。只要回調中沒有任何內容會引發錯誤,測試將被視爲成功。

編輯:因此,根據您的意見,上述聽起來像你的回調是一個事件監聽器多次調用不同的信息。在這種情況下,你可以做的是這樣的:

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.rejectOnError(function (result) { 
     if (result !== 'what I want') { 
      return; 
     } 

     expect(result).to.... something 
     // all other tests… 

     // nothing threw an error, so it is a successful test 
     dfd.resolve(); 
    })); 
}); 

dfd.rejectOnError作品類似,只是它dfd.callback不能自動解決的承諾;最後你自己去做。

+0

感謝您的回答!看看我上面的評論 - 我在那裏描述問題。 – 2013-05-03 01:16:40

1

你的結構沒問題。 dfd爲測試成功設置了5秒的超時時間,然後立即嘗試conn.connect(),這不是實習生框架的一部分。如果您嘗試使用簡單的XHR請求,請嘗試使用getUrlCallback函數。

他們有一個非常酷的測試列表在這個網址:https://github.com/theintern/intern/wiki/Writing-Tests。查找兩個異步示例。