gpt4 book ai didi

javascript - 带有 promise 和单元/集成测试的异步 Javascript

转载 作者:行者123 更新时间:2023-11-29 10:06:53 25 4
gpt4 key购买 nike

我对 Javascript 和异步的世界还很陌生,似乎两者都让我头疼。

所以,我有一个第 3 方客户端 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 ,该 promise 在所有其他 promise 解决时使用 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 返回一个 thenable 对象。回调,它将自动处理 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);
});
});

关于javascript - 带有 promise 和单元/集成测试的异步 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41709055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com