[英]Asynchronous Javascript with Promises and unit/integration tests
我是Javascript和異步世界的新手,似乎兩者都令我頭疼。
所以,我有一個第三方客戶端API,具有以下async
方法getItem(id)
現在我正在嘗試根據它的子項確定父項的狀態:
getStatus = function(ids) {
var failedCount = 0;
var successCount = 0;
var warningCount = 0;
ids.forEach(function(id) {
//calling the async function
getItem(id).then(function(item) {
var state = item.State;
if(state == "Success") {
successCount++;
} else if(state == "Failed") {
failedCount++;
} else if(state == "Warning") {
warningCount++;
}
});
});
if(failedCounter > 0) {
return "Failed";
} else if(warningCounter > 0) {
return "Warning";
} else if(successCounter == ids.length) {
return "Success";
} else {
return "Not run yet";
}
}
然后,為了確保我不會在途中破壞任何東西,我決定進行一些集成測試,所以我決定使用QUnit和qunit-parameterize :
QUnit.cases([
{
title : "Success, Failed => Failed",
ids : [1,2],
expectedItemStateAfter : "Failed"
}
]).test( "", function( params, assert ) {
var done = assert.async(2);
setTimeout(function() {
var value = getStatus(params.ids);
assert.equal(value, params.expectedItemStateAfter);
done();
}, 2000);
});
試圖調整setTimeout
超時,嘗試使用assert.async(2)
和assert.async();
,每個QUnit的默認值,根據他們的文檔,但無濟於事,最終結果仍然是每次都相同,甚至在一堆讀數后,並試圖理解我不知道我做錯了什么:
1. failed @ 2004 ms
Expected: "Failed"
Result: undefined
Diff: "Failed" undefined
您的getStatus
函數在任何異步調用解析之前返回結果。 你需要讓getStatus
返回一個promise,當所有其他promises使用Promise.all
解析時解析:
var getStatus = function(ids) {
var failedCount = 0;
var successCount = 0;
var warningCount = 0;
return Promise.all(ids.map(function(id) {
return getItem(id).then(function(item) {
var state = item.State;
if (state === "Success") {
successCount++;
} else if (state === "Failed") {
failedCount++;
} else if (state === "Warning") {
warningCount++;
}
});
})).then(function() {
if (failedCounter > 0) {
return "Failed";
} else if (warningCounter > 0) {
return "Warning";
} else if (successCounter === ids.length) {
return "Success";
} else {
return "Not run yet";
}
});
};
然后,您需要調整測試代碼,以便它使用promise而不是setTimeout
。 請注意,您可以從QUnit.test
回調中返回一個可對象的對象,它將自動處理Promise
的解析。
QUnit.cases([
{ title: "Success, Failed => Failed", ids: [1, 2], expectedStatus: "Failed" }
]).test("getStatus() test", function(params, assert) {
return getStatus(params.ids).then(function(value) {
assert.equal(value, params.expectedStatus);
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.