如何使用 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 测试事件监听器中的异步函数? 的相关文章

  • 使用把手显示来自 parse.com 的 json 响应

    我想将 json 响应传递给车把 我已经查看了解析文档和 stackoverflow 问题 但我似乎无法弄清楚这一点 这是回应 results address 755 W Yale createdAt 2013 02 09T01 12 15
  • 如何将事件对象传递给 JavaScript 中的函数?

  • 使用 Jquery 附加链接

    我正在尝试根据您所在的页面添加指向我的页面的链接 我使用 Squarespace 来构建这个网站 因此对我来说最简单的方法是使用 Javascript 或 Jquery 我认为我缺少的这个语法有问题 我已经尝试用 来打破引号 但这不起作用
  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • 以编程方式在指令内添加指令

    我想将指令的另一个实例附加到父指令中 但我无法使用 apply 重新编译我的指令 我想我在某个地方错过了一些东西 我的 HTML 代码 div div div div
  • 如何从 Javascript/Typescript 中的数组对象计算运行总计并使用 HTML 在每个实例上显示输出?

    我正在开发一个 MEAN 堆栈项目 并且有一个如下所示的数组 savings any 300 450 350 500 我还有一个名为 saving bf 的变量 它是从数据库中检索的结转储蓄 其值如下 savings bf 15000 我想
  • 如何翻转 Twitter Bootstrap 的工具提示

    我正在使用 Twitter 的 Bootstrap 来实现工具提示 目前 工具提示显示在链接上方 我希望工具提示出现在链接下方 我该怎么做呢 我正在触发工具提示 它明确指出 底部 但它不想为我工作 tooltip tooltip place
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • 是否可以进行条件解构或有后备?

    我有一个具有许多深层嵌套属性的对象 我希望能够访问 MY KEY 上的属性 如下 但如果该属性不存在 则获取 MY OTHER KEY 我怎样才能做到这一点 const X Y MY KEY Values segments segment
  • 从 html5

    我正在寻找一种方法来根据用户代理字符串将控件属性添加到视频标签 我不希望在 iPad 和 Android 之外的任何浏览器或设备上出现控件属性 所以我认为用户代理是最好的识别方法 因为 ipad 和 android 一词出现在各自的 UA
  • IE8 中空 div 层的 z-index 问题

    我在 IE8 中遇到 z index 问题 其他尚未测试 以下 JS 创建一些 html css document write img src border 0 document write div style background col
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • iPhone 点击时使 div 变暗

    当您的 div 附加了点击处理程序时 当点击该 div 时 iPhone 会使该 div 变暗 作为点击指示器 示例 在移动 Safari 上查看http jsbin com awejo3 4 http jsbin com awejo3 4
  • 如何显示 GroupList 的 FormArray?

    我正在尝试制作一个交互式表单 在每一行上列出一个项目以及一个删除按钮 在我的示例中称为 verwijderen 这些项目是从数据库中检索的 并且每个项目都实例化为名为的自定义对象LaborPeriod 然后这些对象被转化为FormGroup
  • 模拟节点外部模块默认使用 jest 的链式方法

    在我们的节点 CLI 中 我们有一个简单的方法 use strict const ora require ora module exports function startSpinner textOnStart color spinnerT
  • Angular 停止 Enter 键提交

    I am trying to stop the Enter from submitting my button and rather make it point to another function I tried trapping th
  • 有没有办法从画布上清除一个元素而不消除其他元素?

    我正在使用画布构建页面加载器 并使用 es6 类 虽然目前我无法使其正常工作 原因之一是我找不到清除画布的方法进展 到目前为止 这是我的代码 class Loader constructor width height this width
  • YouTube iFrame Player API 无法在 DOMWindow 上执行 postMessage

    我正在尝试使用以下命令将 youtube 加载到我的网页中YouTube iFrame Player API 并在加载时出现以下错误 Failed to execute postMessage on DOMWindow The target

随机推荐

  • 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