当状态更新不影响用户界面时,防止未包装在动作(…)中的Jest警告(&C)

原学程将引见当状况革新没有影响用户界里时,避免未包装在举措(...)中的Jest正告(&C)的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

当状态更新不影响用户界面时,防止未包装在动作(...)中的Jest警告(&C) 教程 第1张

成绩描写

我正在测验考试找出能否无方法不妨避免在招致正告产生的状况革新后出有断言时,由Jest/Testing-Library激发的正告中出有包装",或许我能否应当直交疏忽此正告。

假定我有如许1个简略的组件:

import React, {useEffect, useState} from 'react';
import {getData} from 'services';

const MyComponent = () => {
  const [arr, setArr] = useState([]);

  useEffect(() => {
 (async () => {
const {items} = await getData();
setArr(items);
 })();
  }, []);

  return (
 <div>
{!(arr.length > 0) && <p>no array items</p>}
{arr.length > 0 && (
  <ul>
 {arr.map(item => (
<li key={item.id}>{item.name}</li>
 ))}
  </ul>
)}
 </div>
  );
};

export default MyComponent;

假定我只想尝试1下,即便getData()出无为我前往所有数据,此组件也能够正常出现。

所以我有1个如许的尝试:

import React from 'react';
import {getData} from 'services';
import {render, screen} from 'testUtils';
import MyComponent from './MyComponent';

jest.mock('services', () => ({
  getData: jest.fn(),
}));

it('renders', () => {
  getData.mockResolvedValue({items: []});

  render(<MyComponent />);

  expect(screen.getByText('no array items')).toBeInTheDocument();
});

此尝试将经由过程,但是我将获得&out in act(...)&quot;正告,由于尝试将在getData()无机会完成之前完成。

在原例中,getData()的呼应将arr树立为与我最后在组件顶部树立的值(空数组)雷同的值。是以,在Async函数完成后,我的UI没有会变动--我依然在检查1个段降,下面写着&"出稀有组项&"--所以我现实上出有甚么不妨断言的器械,不妨期待状况革新完成。

我不妨expect(getData).toHaveBeenCalledTimes(一),但是这没有会期待在函数挪用后现实革新状况。

我已测验考试在尝试中随意率性暂停,以就有时光使setArr(items)产生:

it('renders', async () => {
  getData.mockResolvedValue({items: []});

  render(<MyComponent />);

  expect(screen.getByText('no array items')).toBeInTheDocument();
  await new Promise(resolve => setTimeout(resolve, 二000));

  expect(screen.getByText('no array items')).toBeInTheDocument();
});

但是这仿佛出有赞助,诚实说,我也没有肯定为何。

能否有方法经由过程仅修正尝试去处置此情形?

我坚信我不妨经由过程重构MyComponent去处理这个成绩,比方,经由过程将arr作为讲具传播给MyComponent并将getData()挪用挪动到女组件,或许创立1些仅用于尝试的自界说讲具去完整跳过getData()挪用,但是我没有想纯洁为了不尝试中的正告而修正组件。

我应用的是testing-library/reactv一一.二.二。

推举谜底

您不妨应用findByText(getByText以及waitFor的组开)保证在断言剖析时产生一切革新。

it('renders', async () => {
 getData.mockResolvedValue({items: []});
 render(<MyComponent />);
 expect(await screen.findByText('no array items')).toBeInTheDocument();
});

佳了闭于当状况革新没有影响用户界里时,避免未包装在举措(...)中的Jest正告(&C)的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。