玩笑中的测试承诺

问题描述 投票:0回答:2

我目前正在尝试在代码库中测试一些Promise重功能。此代码段还具有事件侦听器的额外乐趣。

我将如何进行测试?

const createImage = url =>
  new Promise((resolve, reject) => {
    const image = new Image();
    image.addEventListener("load", () => resolve(image));
    image.addEventListener("error", error => reject(error));
    image.setAttribute("crossOrigin", "anonymous"); // needed to avoid cross-origin issues on CodeSandbox
    image.src = url;
  });

export default createImage;
reactjs promise jestjs tdd
2个回答
0
投票

您可以执行以下操作。这将检查已解决的Promise是否不是错误,是否已成功创建。

describe('Create Image', () => {
  it('Creates Image.', async () => {
    const result = await createImage('some image url here');
    const isError = result instaceOf Error;
    expect(isError).toEqual(false);
  });
});

0
投票

我通过Reddit找到了解决此问题的方法,这是那些有兴趣的人的答案:

这不是关于测试Promises,而是关于测试图像加载操作。 Jest使用JSDOm,我们可以研究其对HTMLImage的实现。不幸的是,没有代码可以触发诸如加载或错误之类的事件。

因此,我们不能模拟请求(例如使用Nock对特定的URL响应500)并验证Promise是否被拒绝(这是最好的)。相反,我们必须依靠实现细节并注入Image.prototype:

let onLoadFn, onErrorFn;
Image.prototype.addEventListener = jest.fn((type, fn) => { 
  if (type === 'load') onLoadFn = fn;
  if (type === 'error') onErrorFn = fn;
});

以及以后的任何一个>

const result = yourFunction('someurl');
onLoadFn();
return expect(result).resolves.toEqual(expect.any(Image));

const result = yourFunction('someurl');
onErrorFn("test");
return expect(result).rejects.toEqual("test");
Also it looks like a known thing in JSDOm that events are not dispatched at least for load/error
© www.soinside.com 2019 - 2024. All rights reserved.