我需要使用Promises为功能编写一个Jest测试,该测试在浏览器中可以很好地工作。
我的代码如下:一个JQuery AJAX调用完成,返回一个promise;解决此承诺后,我将调用另一个函数,该函数也在内部使用另一个Promises!
所以我的Jest测试代码在全球范围内是这样的:
function post(url) {
return $.ajax(url).then((result) => {
resolve(result);
});
}
function showAlert(message) {
return new Promise((resolve, reject) => {
require('anotherPackage').then(() => { // require returns a Promise
anotherPackage.showAlert(message); // will result in DOM update
}).then(resolve, reject);
});
}
function handleResponse(result) {
const promises = [];
...
promises.push(showAlert(message));
...
return Promise.all(promises);
}
test("Promises test", () => {
let response = null,
url = 'http://example.com/result.json';
return post(url).then([result, status, request] => {
response = parseResponse(result);
}).then(() => {
return handleResponse(response).then(() => {
return $('.alert').length;
}).then(value => {
expect(value).toBe(1); // doesn't work, value is 0 !!!
});
});
});
handleResponse 函数正在使用AJAX请求响应,在此用例中,该函数正在调用另一个函数,该函数在内部使用了promise,当其被解析时,它将在DOM内部创建警报。
实际上,作为示例给出的测试不起作用,因为 expect 调用是在内部 handleResponse 承诺被“完全解决”之前完成的!
所以我的问题是:如何用Jest处理这个用例?
最诚挚的问候,
蒂埃里