首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Jest测试事件监听器中的异步函数?

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

Stack Overflow用户
提问于 2020-05-29 22:19:16
回答 1查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
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()

在我的测试中,我有:

代码语言:javascript
复制
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()
}

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

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

代码语言:javascript
复制
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()
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-30 05:26:03

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

代码语言:javascript
复制
await Promise.resolve(document.querySelector('.my-button').click())

它只会产生一秒的延迟,仅此而已。

因为fetchAndRemove是在定义它的同一模块中引用的,所以它不能被窥探,所以fetch promise应该链接起来,以保持正确的执行顺序。

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

代码语言:javascript
复制
  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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62088063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档