如何使用 Jest 测试 asnyc 代码(或使用 jsdom 测试“image.onload”)

2023-12-06

[编辑]:我已经用 Promise 方式更改了我的代码。

我正在写反应this由facebook创建的starter,我是测试方面的新手。

现在我有一个关于图像的组件,它有一个检查图像大小的功能:

import React, { Component } from 'react';


class ImagePart extends Component {
    .....
    //  check size.
    checkSize(src, width, height){
        this.loadImg(src)
        .then((obj) => {
            return (obj.width >= width && obj.height >= height)
            ? true : false;
        })
        .catch((msg)=> {
            dosomething
        });
    }
    // load image and return a promise.
    loadImg(src){
        return new Promise((resolve, reject) => {
            let imageObj = new Image();
            imageObj.onload = (evt) => {
                resolve(evt.target);
            }
            imageObj.error = (err) =>{
                reject(err);
            }
            imageObj.src = src; 
        })
    }
    .....
}

和测试片段:

import React from 'react';
import ReactDOM from 'react-dom';
import ImagePart from './ImagePart';



it('checking image size without error', () => {
    const image = new ImagePart();
    const img300_300 = 'https://someImage.png';
    expect(image.loadImg(img300_300).width).resolves.toBe(300);
    // ??? test checkSize
});

运行测试后,我收到此错误:

类型错误:无法读取未定义的属性“toBe”

问题是:

  1. 如何以正确的方式测试`loadIng?
  2. 测试 checkSize 的一般模式是什么?

谢谢。


目前的实施checkSize是异步的并且总是返回undefined.

你应该使用callback或返回一个Promise.

function checkSizeWithCallback(src, width, height, callback) {
  const image = new Image();
  image.onload = evt => {
    const result = evt.target.width >= width && evt.target.height >= height;
    callback(null, result);
  };
  image.onerror = // TODO: handle onerror
  image.src = src; 
}


it('...', done => {
  checkSizeWithCallback(/* args */, (err, result) => {
    expect(result).toEqual(true);
    done(err);
  });
});

function checkSizeWithPromise(src, width, height) {
  return new Promise((resolve, reject) => {
    const image = new Image();
    image.onload = evt => {
      const result = evt.target.width >= width && evt.target.height >= height;
      resolve(result);
    };
    image.onerror = // TODO: handle onerror
    imageObj.src = src; 
  });
}


it('...', () => {
  return checkSizeWithPromise(/* args */)
    .then(result => {
      expect(result).toEqual(true);
  });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jest 测试 asnyc 代码(或使用 jsdom 测试“image.onload”) 的相关文章

随机推荐

  • 示例函数中的替换是什么意思? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 当我尝试从数据框中随机选择每组中的 10 个样本时 我试图弄清楚样本函数的工作原理 我有一个 5 列和 7000 行的数据框 我将数据集分成大约 200 个组 然后我想从每组
  • 在 UIButton 的选择器上传递参数

    我有一个detailDisclousurea 的标注上的按钮MKAnnotation 当按下此按钮时 我需要调用一个传递标识参数的方法annotation那叫它 怎么可能呢 这是我的注释视图 MKAnnotationView mapView
  • 如何使用 Git 恢复

    How is git revert used 这可能听起来像是一个重复的问题 但当人们问这个问题时 答案通常是 使用git reset as per 恢复到 Git 中 SHA 哈希的提交 然后当有人问如何使用时git reset人们回复说
  • 车把和异步调用

    我使用这个助手来检查图像是否存在 Handlebars registerHelper checkLogo function url UrlExists url function status if status 200 return new
  • Delphi w Indy 10:无法通过 Web 服务器上的 SSL“最佳实践”通过 TLS 1.2 连接

    问题 我们如何让 Indy 10 与强制执行最新 TLS 1 2 SSL 最佳实践的 Web 服务器配合使用 Microsoft 记录了最佳实践 https technet microsoft com library security ms
  • AvalonDock 现在失去 Alt 键装饰

    I ve been using AvalonDock 2 0 for some time now being key for managing documents in an IDE In the last month or so I ve
  • 如何给物体的旋转设置2个限制?

    当按住 D 向上 W 向下时 我需要使对象在 z 轴上旋转 但限制两个方向的旋转 使用下面提供的代码 我设法使对象在按下时旋转 但它不会停止当达到我的变量设置的两个限制中的任何一个时旋转 我是编码领域的新手 希望您能帮助我解决和理解我的问题
  • 最快的素性测试

    您能否建议一种可在实践中使用的快速 确定性方法来测试大数是否为素数 另外 我想知道如何正确使用非确定性素性测试 例如 如果我使用这样的方法 如果输出为 否 我可以确定一个数字不是素数 但是当输出为 可能 时 其他情况又如何呢 在这种情况下我
  • 为什么我的 Realm 对象不保存存储的值?

    我正在四处寻找一种解决方案 以在我的一个应用程序中实现小型离线数据存储 该解决方案使用起来既简单又快捷 无论如何 我遇到了Realm去做这个 但是 我遇到一个问题 每次启动应用程序时 数据库中的内容都是空的 我完成所有分配并调用开始写事务方
  • 在 R 中将星期几从整数转换为字符串

    我有一个数据集 其中包含一周中的事件数字 1 7 1 是星期一 7 是星期日 我已将其转换为用户可以理解的星期几 星期一 星期二等 只需将该行中的每个 1 实例替换为星期一 等 即可 有没有一个图书馆可以更干净地为我做这件事 set see
  • Django storages S3 - 存储现有文件

    我有 django 1 11 和最新的 django storages 使用 S3 后端进行设置 我正在尝试使用 AWS 图像链接作为起点 以编程方式实例化图像文件 我无法弄清楚如何通过查看源代码 文档来做到这一点 我假设我需要创建一个文件
  • 来自 cv::solvePnP 的世界坐标中的相机位置

    我有一个校准过的相机 固有矩阵和畸变系数 我想知道相机的位置 知道一些 3d 点及其在图像中的对应点 2d 点 我知道cv solvePnP可以帮助我 阅读后this and this我知道我的输出solvePnPrvec and tvec
  • 服务器端问题:PHP 将消息推送到黑莓

    我正在使用来自的客户端代码http supportforums blackberry com t5 BlackBerry Push Development Simplified BIS Push client sample ta p 693
  • getElementsByClassName 问题[重复]

    这个问题在这里已经有答案了 我目前遇到 getElementsByClassName 属性的问题 我有一个显示和隐藏功能 当您将鼠标悬停在产品上时会显示一个按钮点击这里我已经使用 getElementById 属性启用了此函数 但是由于我想
  • 如何在 Visual Studio 2015 中关闭解决方案范围分析?

    在我同事的 PC 上 Visual Studio 2015 有时会显示一条消息 检测到内存不足 解决方案范围内的分析已关闭 显示此消息后 一切都快得多 如何手动关闭此分析 Edit 是的 我使用 Resharper 但这不是我想要的 代码分
  • Pandas:如何创建一个简单的计数器来增加每 n 行?

    有没有办法创建一个每 n 行加一的计数器 示例 gt 计数器每 4 行增加 counter 0 1 1 1 2 1 3 1 4 2 5 2 6 2 7 2 8 3 9 3 我正在尝试df counter np arange len df 4
  • 如何控制绑定到 CustomObject 的 DataGridView 中的列类型?

    我在 C WinForms 应用程序中有一个 DataGridView 它在运行时 通过 Form Load 数据绑定到自定义对象 在 DataGridView 的设计视图中 我没有设置列 当表单加载时 将根据数据绑定到的自定义对象中的数据
  • 有负零吗?

    我正在编码简单的计算器只是为了开始 iPhone 开发 问题是我有一个 按钮 它应该通过执行一个简单的操作来否定已经放在屏幕上的任何内容 1 它工作正常 除非先前的输入是0 设想 屏幕空白或0 我点击 进行否定 然后当我点击例如9我希望它能
  • Java 中带有参数的高效 XSLT 管道

    这个问题的最佳答案描述了一种在 Java 中实现高效 XSLT 管道的技术 Java 中的高效 XSLT 管道 或将结果重定向到源 不幸的是 虽然 Transformer 似乎公开了一个用于设置 XSLT 参数的 API 但这似乎没有任何效
  • 如何使用 Jest 测试 asnyc 代码(或使用 jsdom 测试“image.onload”)

    编辑 我已经用 Promise 方式更改了我的代码 我正在写反应this由facebook创建的starter 我是测试方面的新手 现在我有一个关于图像的组件 它有一个检查图像大小的功能 import React Component fro