如何使用 Jest 测试事件监听器中的异步函数?

2024-02-19

我有一个运行异步函数的事件监听器,并在完成后从 DOM 中删除一些元素:

async function fetchAndRemove() {
  try {
    const response = await fetch('/endpoint-that-returns-json')

    const result = await response.json()
    if (result.status === 'Success') {
      document.querySelector('.my-element').remove()
    }
  } catch (error) {
    console.log(error)
  }
}

function setupListeners () {
  const button = document.querySelector('.my-button')
  button.addEventListener('click', () => {
    fetchAndRemove()
  })
}


setupListeners()

在我的测试中,我有:

import fetch from 'jest-fetch-mock';

test('it removes the element after clicking', () => {
  fetch.mockResponse(JSON.stringify({ status: 'Success' }))
  setupListeners()
  document.querySelector('.my-button').click() // .click comes from JSDOM

  expect(document.querySelector('.my-element')).toBeNull()
}

然而,这不起作用,因为我相信测试,设置事件侦听器并单击按钮同步运行,并且不等待异步工作完成。

我尝试了这个想法但没有好的结果:

test('it removes the element after clicking', async () => {
  fetch.mockResponse(JSON.stringify({ status: 'Success' }))
  setupListeners()
  await Promise.resolve(document.querySelector('.my-button').click())

  expect(document.querySelector('.my-element')).toBeNull()
}

这是错误的,因为 DOM 事件不涉及承诺并且await Promise.resolve是多余的:

await Promise.resolve(document.querySelector('.my-button').click())

它会产生一滴延迟,仅此而已。

Since fetchAndRemove在它定义的同一模块中被引用,它不能被监视,所以fetchPromise 应该被链接起来以保持正确的执行顺序。

考虑到fetch是一个间谍,它可以是:

  fetch.mockResponse(JSON.stringify({ status: 'Success' }))
  setupListeners()
  document.querySelector('.my-button').click()
  await fetch.mock.results[0].value; // delay for fetch()
  await null; // another delay for res.json()
  expect(fetch).toBeCalledWith('/endpoint-that-returns-json')
  expect(document.querySelector('.my-element')).toBeNull()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jest 测试事件监听器中的异步函数? 的相关文章

  • 仅 HTTP 支持跨源请求,但不支持跨域

    我使用此代码发出 AJAX 请求 userBarSignup click function get C xampp htdocs webname resources templates signup php params function
  • 异步等待图像加载事件触发器[重复]

    这个问题在这里已经有答案了 我有一个奇怪的想法 我无法思考 const load url gt return new Promise resolve gt const img new Image img onload gt resolve
  • Promise.defer 的正确模式是什么?

    我正在使用 TypeScript 和async await来表示异步工作流程 该工作流程的一部分是调用 Web Worker 并在其回调结果时继续 在 C 中 我会创建一个TaskCompletionSource await its Tas
  • 如何在javascript中计算日出和日落?

    我正在使用appcelerator titan开发一个IOS应用程序 我想让我的应用程序在日出和日落时向用户发送本地通知 解决这个问题的一个好工具是使用 YQL 的雅虎天气 但是 雅虎天气仅供非商业用途 我正在尝试找到一个javascrip
  • Highstock highcharts 不规则数据的 x 尺度错误

    我有不规则的数据 我使用时图表绘制得很好高图表 function var chart new Highcharts Chart chart renderTo chart xAxis type datetime series name Vol
  • AngularJS 使用 $apply 而不使用 $scope

    我开始使用 AngularJS 并且接受了用它来编写控制器的约定 而不是用 scope 所以我的控制器看起来像这样 myApp controller SomeController function this myModel id 1 nam
  • React 渲染中的不变违规或 React 中迭代和返回的正确方法

    我在 React 渲染中遇到了持续存在的问题 这段代码 jsx React DOM var AnswerRows React createClass componentDidMount function render function th
  • 如何使用 axios / jest 测试失败的请求

    我创建了一个非常小的应用程序 如果您传递硬币和数量 它可以计算为某些加密货币支付的总价格 我想测试错误 但我总是收到 收到的承诺已解决而不是被拒绝 我相信这是因为如果 url 错误 axios 仍然会解决承诺 我遇到的第二个问题是 我尝试测
  • 通过 SVG 背景传递鼠标事件

    我有两个 SVG 元素 每个元素覆盖整个屏幕 html body height 100 svg position absolute top 0 left 0 bottom 0 right 0
  • 检查 DOM 元素是否为复选框

    如何检查给定的 DOM 元素是否为复选框 设想 我有一组文本框和复选框 其中的值是动态分配的 我没有办法识别 DOM 元素是复选框还是文本框 只使用普通的 javascript 你就可以做到 if el type el type check
  • 通知用户消息仍在输入中

    我正在使用 Laravel 5 6 7 Socket IO 和 vue js 我没有使用 Pusher 和 redis 下面是我的代码 用于向与我一对一聊天的用户发送消息 var url http localhost 6001 apps M
  • 来自 DataURL 的 Blob?

    Using FileReader s readAsDataURL 我可以将任意数据转换为数据 URL 有没有办法将数据 URL 转换回Blob使用内置浏览器 API 的实例 用户 Matt 一年前提出了以下代码 如何在javascript中
  • 使用 NodeJS 让 Discord 机器人发送带有消息的图片

    我有几张照片 全部在 imgur 上 带有直接图像链接 格式 https i imgur com XXXXXX jpg https i imgur com XXXXXX jpg 以及用 NodeJS 制作的 Discord 机器人 我发送这
  • 是否可以将反应组件导出为非反应项目中的函数

    有没有办法在非 React 项目中将 React 组件导出为函数并传入 props 作为函数的参数 我最近用 create react app 完成了一个 React 项目 现在我想将它用于其他非 React 项目 纯 Javascript
  • 是否可以覆盖 javaScript 原始数据类型?

    问题是不言自明的 我知道可以扩展原始数据类型 例如string但有可能覆盖它吗 这是在采访中被问到的一个问题 不 你不能覆盖任何东西 Ecma脚本定义原始类型 http es5 github com x4 3 2 Undefined Nul
  • 在 JavaScript 中比较表单中的两个数字

    当我尝试比较不同的数字时 数字发生变化 但文本部分保持不变 这只发生在较大 较小的情况下 而不会发生在 NaN 或相等的情况下 这是我的代码 function check var a document getElementById a va
  • Telegram 授权无默认按钮

    使用 Telegram 第 3 方授权的唯一有记录的方法是使用其提供的脚本https core telegram org widgets login https core telegram org widgets login 这个脚本 正如
  • jQuery Blur() 在 Chrome 上不起作用

    我在 MacOSX 上运行这个http jsfiddle net q84wv http jsfiddle net q84wv on Chrome最新版本 它不会工作 在 Firefox 上运行时它工作得很好 有什么线索吗 假设您想要aler
  • 使用 jQuery 仅从字符串末尾修剪空格

    我知道 jQuery trim 函数 但我需要的是一种仅从字符串末尾修剪空格的方法 而不是开头 So str this is a string 会成为 str this is a string 有什么建议么 Thanks 您可以使用正则表达
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li

随机推荐

  • Javascript:文件构造函数的参数 1 无法转换为序列

    我正在尝试更改 a 的文件名File通过 JavaScript 对象
  • 如何用curl和php欺骗referrer? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个简单的完整 php curl 代码来欺骗引荐来源网址 我尝试了其他一些但不起作用 我检查的最后一个是这个 function
  • 如何禁用屏幕固定中生成的 Toast 消息?

    我正在开发锁屏应用程序 我想禁用主页按钮 我的应用程序是 设备所有者和设备管理员 现在我正在使用屏幕固定来禁用主页按钮 但是 如果我每次收到消息 屏幕已固定 并关闭 屏幕已取消固定 时就开始活动 并且如果单击主页 则 您的组织不允许取消固定
  • 关于c#中的静态类[重复]

    这个问题在这里已经有答案了 可能的重复 何时在 C 中使用静态类 https stackoverflow com questions 241339 when to use static classes in c 为什么有人会编写静态类 我们
  • 记忆化Python函数

    这是一小段代码 它将每个函数转换为其记忆版本 def memoize f Memoize a given function f def memf x if x not in memf cache memf cache x f x retur
  • 我可以通过编程方式将外部 exe 标记为“安全运行(未知发布者)”吗?

    所以我有自己的应用程序 main exe 在某些安全级别较高的计算机中 由于 未知发布者 它会显示警告 我试图 绕过 它 现在我知道了right方法是对程序集进行签名 购买证书并成为已知的发布者 然后它就不会显示此警告 但证书并不便宜 我的
  • 在没有 Google Apps 的情况下通过 Google Play 商店在私人渠道中部署应用程序?

    我正在构建一个 Android 应用程序 出于各种原因不能公开上市在 Google Play 商店中 我找到了有关的信息Google Play 私人频道 https support google com a answer 2494992 h
  • 在 xPages 中使用数据上下文有什么好处?

    我从未在 xPages 中使用过数据上下文 想了解其好处 如果我想返回内存中的某些内容 我经常调用 SSJS 脚本库中的函数 我相信该脚本库也存储在内存中 假设我在 ssjs 中有一个返回 Notesdocument 的函数 这个函数可能会
  • PHP 架构以及按引用传递与按值传递

    寻求PHP架构师的建议 我对 PHP 不是很熟悉 但已经接管了用该语言编写的大型分析包的维护工作 该架构旨在将报告数据读取到大型键 值数组中 这些数组通过各种解析模块传递以提取每个模块已知的报告参数 已知的参数将从主阵列中删除 并且任何模块
  • Rails paths.rb 语法

    我搜索了又搜索 但找不到详细说明 Rails 3 中的routes rb 语法的页面 有指南 概述 甚至高级示例 但为什么没有一个页面详细说明每个关键字的确切语法 这一页 http www engineyard com blog 2010
  • 在 C# 中引发事件的单元测试(按顺序)

    我有一些代码会引发PropertyChanged事件 我希望能够对事件是否正确引发进行单元测试 引发事件的代码就像 public class MyClass INotifyPropertyChanged public event Prope
  • C++ 中通过常量引用将指针传递给对象

    我正在为大学做一项实际作业 但遇到了一个问题 我有一个声明此方法的类 bool graficarTablero const Tablero tablero const string nombreArchivo 我想通过常量引用传递指向对象
  • IF a == true OR b == true 语句

    我找不到让 TWIG 解释以下条件语句的方法 if a true or b true do stuff endif 我错过了什么还是不可能的 检查这个树枝参考 https github com vito chyrp wiki Twig Re
  • 仍然出现“无法获取连接工厂客户端”错误

    04 01 10 17 20 701 E MapActivity 377 无法获取连接工厂客户端 我得到的只是灰色瓷砖 并且地图未加载 嘿 我认识的每个人都有很多类似的帖子 我彻底浏览了它们 它可以是互联网权限 我在应用程序标签之前添加了该
  • 为什么它被称为成员初始化器

    引用自办公室 Swift 文档 https developer apple com library ios documentation Swift Conceptual Swift Programming Language ClassesA
  • Service Worker 注册失败

    我目前正在研究服务人员来处理浏览器中的推送通知 目前我遇到了 软件注册失败错误 软件注册失败 出现错误 SecurityError 无法注册 ServiceWorker 不支持当前源 null 的 URL 协议 Check client1
  • 当我的本地存储库上只有项目的子目录时,是否可以在 Git 上推送?

    我有一个本地 git 存储库 配置为通过 Gitlab 上的 SSH 远程连接 我们称之为 email protected cdn cgi l email protection myrepo myproject git 在克隆存储库后 我喜
  • 我的 VS code 打开时总是崩溃

    I have tried uninstalling and reinstalling it but the problem did not dissappear It seems that when I open the app more
  • SmartAssembly 的异常处理和报告替代方案?

    我对用于异常处理的 SmartAssembly 解决方案感到满意 但我报告了一个问题红门论坛 http www red gate com messageboard viewtopic php t 12642并且尚未解决 SA 有哪些替代方案
  • 如何使用 Jest 测试事件监听器中的异步函数?

    我有一个运行异步函数的事件监听器 并在完成后从 DOM 中删除一些元素 async function fetchAndRemove try const response await fetch endpoint that returns j