简体   繁体   English

如何正确编写 Jest 测试以避免 act() 警告?

[英]How correctly write Jest test for avoid act() warning?

useEffect usually use Promises for update state. useEffect 通常使用 Promises 来更新 state。

This updates cause long warning in jest: Warning: An update to null inside a test was not wrapped in act(...).此更新会开玩笑地发出长时间警告: Warning: An update to null inside a test was not wrapped in act(...).

How correctly write Jest Test for such case?对于这种情况如何正确编写 Jest Test?

live example, Reproducible Example:活生生的例子,可重现的例子:

https://codesandbox.io/s/jest-test-for-useeffect-with-promises-spieq?file=/index.test.js https://codesandbox.io/s/jest-test-for-useeffect-with-promises-spieq?file=/index.test.js

index.test.js index.test.js

import React from "react";
import Hello from "./Hello";
import { create, act } from "react-test-renderer";

it("works", () => {
  let root;
  act(() => {
    root = create(<Hello />);
  });

  // console.log("From test:", );
  let repr = JSON.stringify(root.toJSON());
  expect(repr).toBe('{"type":"span","props":{},"children":["Hello! "]}');
});

Hello.js你好.js

import React, { useState, useEffect } from "react";

export default () => {
  const [count, setCount] = useState();

  useEffect(() => {
    Promise.resolve({}).then(() => setCount(4));
  }, []);

  return <span>Hello! {count}</span>;
};

在此处输入图像描述

Upd 1:更新1:

the same result for one of propasal:其中一个propasal的结果相同:

在此处输入图像描述

I would like to suggest you to use testing-library/react which could be use smoothly with jest and provide async methods我想建议您使用测试库/反应,它可以与 jest 一起顺利使用并提供异步方法

Your test would become something like:你的测试会变成这样:

import React from "react";
import Hello from "./Hello";
import { render } from '@testing-library/react';

it("works", () => {
   const { baseElement } = render(<Hello />);
   expect(baseElement).toBeTruthy();
});

Looks like this sample works correct看起来这个示例工作正常

import React from "react";
import Hello from "./Hello";
import { render, screen, waitFor } from "@testing-library/react";
import "@testing-library/jest-dom";

it("works", () => {
  render(<Hello />);
  return waitFor(() => screen.getByText("Hello! 4"));
  // expect(baseElement.toBeTruthy();
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM