首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何与useEffect/setState挂钩

如何与useEffect/setState挂钩
EN

Stack Overflow用户
提问于 2019-07-12 23:44:52
回答 1查看 444关注 0票数 1

我在通过以下测试时遇到了问题:

代码语言:javascript
代码运行次数:0
运行
复制
import { useEffect, useState } from "react";

export function useComponentResources(required) {
  const [componentResources, setComponentResources] = useState(null);

  useEffect(() => {
    if (required) {
      // api call
      setTimeout(() => setComponentResources({}), 100);
    }
  }, [required]);

  return componentResources;
}
代码语言:javascript
代码运行次数:0
运行
复制
import { renderHook } from "@testing-library/react-hooks";
import { useComponentResources } from "./component-resources.hook";

describe("component-resources.hook", () => {
  it("fetches resources when required", () => {
    //act
    const { result } = renderHook(() => useComponentResources(true));

    //assert
    expect(result.current).toEqual({});
  });
});

它总是失败:

代码语言:javascript
代码运行次数:0
运行
复制
expect(received).toEqual(expected)

Expected value to equal:
  {}
Received:
  null

Difference:

  Comparing two different types of values. Expected object but received null.

   7 |     const { result } = renderHook(() => useComponentResources(true));
   9 |     //assert
> 10 |     expect(result.current).toEqual({});
  11 |   });
  12 | });

我已经在codesandbox中创建了一个再现案例:

https://codesandbox.io/embed/priceless-browser-94ec2

EN

回答 1

Stack Overflow用户

发布于 2019-07-13 02:00:40

renderHook不会等待你的setTimeout触发;它不会知道你的组件有什么“副作用”。因此,当您的expect()运行时,当前值仍然是它的默认值- null

我们可以通过使用renderHook返回的对象上的waitForNextUpdate来强制测试等待,直到钩子再次更新。waitForNextUpdate是一个返回promise的函数,一旦钩子再次更新(例如,当您的setTimeout被触发时),promise就会解析。

代码语言:javascript
代码运行次数:0
运行
复制
import { renderHook } from "@testing-library/react-hooks";
import { useComponentResources } from "./component-resources.hook";

describe("component-resources.hook", () => {
  it("fetches resources when required", async () => {
    const { result, waitForNextUpdate } = renderHook(() => useComponentResources(true));

    await waitForNextUpdate();

    expect(result.current).toEqual({});
  });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57010192

复制
相关文章

相似问题

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