javascript - Ava 使用 Promise : promise returned by test never resolved 测试图像加载

标签 javascript unit-testing ava

我想测试我的 promise 函数来加载图像,代码如下所示:

function imagePromise() {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.addEventListener('load', () => resolve(true));
    img.addEventListener('error', () => reject(false));
    img.src = 'http://78.media.tumblr.com/tumblr_lr9mx5Axur1qlyuwso1_1280.jpg';
  });
}

当我在浏览器中使用我的 promise 时,它工作正常:

imagePromise().then((result) => console.log(result));
// fulfill the promise and log the result: true

但是,当我使用 ava 测试我的 promise 时和 browser-env ,ava返回错误:

Promise returned by test never resolved

我的测试文件如下所示:

import test from 'ava';

function imagePromise() {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.addEventListener('load', () => resolve(true));
    img.addEventListener('error', () => reject(false));
    img.src = 'http://78.media.tumblr.com/tumblr_lr9mx5Axur1qlyuwso1_1280.jpg';
  });
}

test('load image with promise', (t) => {
  return imagePromise().then((result) => {
    t.is(result, true);
  });
});

请注意,由于浏览器兼容性问题,我都尝试了 addEventListeneronload/onerror 方法,并且 browser-env 已 configured to work with ava 。我有什么遗漏的吗?

最佳答案

我终于修复了我的测试,使用 browser-env (它本身使用 jsdom )。我做了一个small repo for people interested :

我的第一个错误是我忘记安装 canvas-prebuilt ,这允许 jsdom操纵imagescanvas元素。

// install browser-env and canvas-prebuilt
// (https://github.com/jsdom/jsdom#loading-subresources)
yarn add browser-env canvas-prebuilt -D

我的第二个错误是我忘记在 browser-env 上放置特殊配置测试声明,在test/helpers/setup-browser-env.js中文件:

require('browser-env')(['window', 'document', 'Image'], {
  resources: 'usable',
});

然后我们可以运行我们的图像加载 promise 测试,从 test/test.js :

import test from 'ava';

function imagePromise() {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.addEventListener('load', () => resolve(true));
    img.addEventListener('error', () => reject(false));
    // an heavy 4k wallpaper to check if promise is resolved after a long time
    img.src = 'https://www.wallpaperup.com/wallpaper/download/991808/8000/5224';
  });
}

test('load image with promise', (t) => {
  return imagePromise().then((result) => {
    t.is(result, true);
  });
});

要运行测试,您可以执行 ava但我强烈建议添加 --verbose标记,因为它有助于使用 --watch 进行调试标志(一种用于测试的实时重新加载)。

关于javascript - Ava 使用 Promise : promise returned by test never resolved 测试图像加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48840541/

相关文章:

javascript - Flexbox 布局 - 如果足够长则多行

表单中的 javascript 验证

unit-testing - Grails Interceptor模型在单元测试中为空

babeljs - Ava 附加 babel 插件未运行

javascript - 未处理的 promise 拒绝 AVA

javascript - 谷歌浏览器加载我没有安装的扩展程序

JavaScript 事件传播不适用于 Firefox 上的 HTML 按钮子元素。

具有类型和值参数化的 C++ 单元测试框架

安卓工作室 : grant permission between installing test APK and running tests with graphical test runner

node.js - 如何在 puppeteer 中处理多个窗口?