【问题标题】:Component is not updating after async changing state异步更改状态后组件未更新
【发布时间】:2019-11-21 14:24:21
【问题描述】:

在我的应用程序中,我进行了如下所示的测试,但是单击后,即使手动测试的行为有效,该语句也不正确:

import React, { useState } from 'react'
import { mount } from 'enzyme'

const Conceito = () => {
  const [alerta, setAlerta] = useState(false)

  const pesquisarOnClick = () => {
    setTimeout(() => setAlerta(true), 500)
  }

  return (
    <div>
      { alerta && <div data-component="Alerta">Mensagem</div> }
      <button
        action-trigger="pesquisar"
        onClick={pesquisarOnClick}
      >Pesquisar</button>
    </div>
  )
}

describe('<Conceito/>', () => {
  it('prova de conceito', async () => {
    const wrapper = mount(<Conceito/>)
    expect(wrapper.find(`[data-component='Alerta']`)).toHaveLength(0)
    wrapper.find(`[action-trigger='pesquisar']`).simulate(`click`)
    await wrapper.update()
    expect(await wrapper.find(`[data-component='Alerta']`)).toHaveLength(1)
  })
})

我的错误在哪里?

【问题讨论】:

  • ``` lang-js import { render, fireEvent, waitForElement } from '@testing-library/react' describe('', () => { it('prova de conceito', async () => { const { container } = render() expect(container.querySelector("[data-component='Alerta']")).toBeNull() fireEvent.click(container. querySelector("[action-trigger='pesquisar']")) expect(awaitwaitForElement(() => container.querySelector("[data-component='Alerta']"))).not.toBeNull() }) }) ```

标签: reactjs async-await settimeout enzyme


【解决方案1】:

Enzyme wrapper 的函数 findupdate 是同步的,无需使用 async/await 将它们解析为 Promise。这也意味着它们会立即执行,而无需等待您的 500 毫秒超时。

如果您需要专门等待这 500 毫秒,您可能需要在测试中引入某种等待功能:

function wait(miliseconds) {
  return new Promise((resolve) => {
    setTimeout(resolve, miliseconds)
  })
}

然后await wait(500)(可能更多)在您之前update 组件并声明您的结果

【讨论】:

  • 我知道查找和更新是同步的,但是当“pesquisar”点击时我的结果不是。正因为如此,我相信我必须在测试中使用 async/await 来等待 promise (setTimeout) 解决并更改警报状态。
  • 如果pesquisarOnClick 的状态设置器是一个已解决的承诺的结果,它不会改变酶的功能是同步的这一事实。 Enzyme 只是触发 onClick 事件,并不知道您的处理程序是异步的,需要等待。
猜你喜欢
  • 2021-06-15
  • 2019-04-17
  • 2017-05-05
  • 2018-09-21
  • 1970-01-01
  • 2021-08-21
  • 2019-12-23
相关资源
最近更新 更多