在 Jest 中测试 Promises
Testing Promises in Jest
我目前正在尝试在代码库中测试一些 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;
您可以通过以下方式完成。
这将检查已解决的 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);
});
});
我通过 Reddit 找到了这个问题的解决方案,这里是感兴趣的人的答案:
这不是关于测试 Promise,而是关于测试图像加载操作。 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
我目前正在尝试在代码库中测试一些 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;
您可以通过以下方式完成。 这将检查已解决的 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);
});
});
我通过 Reddit 找到了这个问题的解决方案,这里是感兴趣的人的答案:
这不是关于测试 Promise,而是关于测试图像加载操作。 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