2015-02-24 16 views
3

我正在爲返回promise的函數編寫測試,並且無法在解析或拒絕promise時運行斷言。我不能在這個項目上使用ES6,所以我使用聲明實現Promises/A +規範的rsvp.js庫。我使用的是最新版本的qunit 1.17.1如何在解析Promise時運行qunit斷言

功能測試:

var loadGroups = function(data) { 
    return new RSVP.Promise(function(resolve, reject) { 
     var groups = []; 
     // ... some code to populate the groups array 
     if(groups.length > 0) { 
      resolve(groups); 
     } else { 
      reject("No groups were loaded"); 
     } 
    }); 
}; 

成功測試:

test('success test', function(assert) { 
    assert.expect(1); 

    var promise = loadGroups(testData); 

    promise.then(function(groups) { 
     assert.deepEquals(groups.length, 1); 
    }); 

    return promise; 
}); 

這種失敗,「預計1個斷言,但0被運行「


fa ilure測試:

test('failure test', function(assert) { 
    assert.expect(1); 

    var promise = loadGroups([]); 

    promise.then(null, function(message) { 
     assert.equals(message, "No groups were loaded"); 
    }); 

    return promise; 
}); 

這種失敗,「無極裝載空組時,你得到的承諾期間拒絕:沒有組分別裝」

回答

10

承諾通過鏈接工作。承諾是不變的價值包裝。

當你這樣做:

promise.then(function(e){ 
    // do something 
}); 

你不改變你promise正在創建一個新的承諾來代替。相反,你需要鏈中的承諾:

test('success test', function(assert) { 
    assert.expect(1); 

    var promise = loadGroups(testData); 

    // return the `then` and not the original promise. 
    return promise.then(function(groups) { 
     assert.deepEquals(groups.length, 1); 
    }); 

}); 
+0

我能理解這對於第二種情況(其中測試拼命地跑可能會想到履行承諾),但在第一種情況下斷言應該總是在測試運行前執行被告知該承諾已解決? – Bergi 2015-02-24 12:21:52

+0

@Bergi記住我們正在談論的測試運行者,它承諾爲它構建什麼,以及它們缺少什麼保證:) – 2015-02-24 13:01:05

+0

我不知道Qunit,但假設它註冊了自己的'then'處理程序以通知解析,承諾將保證在此之前執行斷言。 – Bergi 2015-02-24 13:03:45