开玩笑的承诺测试

时间:2020-06-15 15:26:09

标签: javascript promise jestjs

我需要使用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处理这个用例?

最诚挚的问候,

蒂埃里

0 个答案:

没有答案