簡體   English   中英

具有Promises和單元/集成測試的異步Javascript

[英]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";
    }
}

然后,為了確保我不會在途中破壞任何東西,我決定進行一些集成測試,所以我決定使用QUnitqunit-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM