执行同一组件的两次渲染时,按钮禁用属性未正确更新

robowen5mac

我刚刚开始使用 react-testing-library,所以我猜测这最终归结于用户错误,但我看到以下行为对我来说没有意义。

对于在新创建的 CRA 应用程序中运行以下测试,并使用 jest-dom 3.0.0 和 react-testing-library 5.4.4:


    import React from "react";
    import { render } from "react-testing-library";
    import "jest-dom/extend-expect";

    import Component from "./Component";

    describe("Verify UI state based on jobs", () => {
      it("mounts with no previous data", () => {
        const { getByTestId } = render(<Component data={[]} />);
        expect(getByTestId("refresh-button")).toBeDisabled();
      });

      it("mounts with previous data", () => {
        const { getByTestId } = render(<Component data={["hi"]} />);
        expect(getByTestId("refresh-button")).not.toBeDisabled();
      });
    });

    /*
    const Component = props => {
      return (
        <div>
          <button data-testid="refresh-button" disabled={props.data.length === 0}>
            Refresh
          </button>
        </div>
      );
    };
    */

事情是我得到以下失败:

根据作业验证 UI 状态 › 使用以前的数据挂载

expect(element).not.toBeDisabled()

Received element is disabled:
  <button data-testid="refresh-button" disabled="" />

  13 |   it("mounts with previous data", async () => {
  14 |     const { getByTestId } = render(<Component data={["hi"]} />);
> 15 |     expect(getByTestId("refresh-button")).not.toBeDisabled();
     |                                               ^
  16 |   });
  17 | });
  18 |

  at Object.toBeDisabled (src/Component.test.js:15:47)

但是,如果我禁用第一个测试,那么第二个现在应该通过。如果我重新排序,第一个测试总是通过而第二个总是失败,即使第一个测试是“使用先前数据的安装”测试。

不确定这是否是测试库、jest-dom 或我的代码中的问题,但任何有关如何正确构建这些测试的建议将不胜感激。

布赖恩亚当斯

文档目前声明 whenrender被调用时“来自的查询dom-testing-library自动返回,它们的第一个参数绑定到呈现的容器”

事实证明,这是文档中的一个错误,因为document.body如果将 nocontainer传递给render(代码herehere,查询实际上是绑定到的

react-testing-library使用 DOM,除非cleanup在测试之间调用,否则来自早期测试的 DOM 元素仍将存在,并将包含在以后的查询结果中。

在这种情况下Componentdocument.body在第二次测试期间两个元素都存在,并且由于getByTestId查询document.body最终会找到它们,当它找到多个时,它返回它找到的第一个

这意味着在第二个测试中会Component返回来自第一个测试的getByTestId,这会导致测试失败,因为第一个组件被禁用。


要解决此问题,请确保cleanup在每次测试后调用以删除在先前测试中添加的任何 DOM 元素:

import React from "react";
import { render, cleanup } from "react-testing-library";
import "jest-dom/extend-expect";

afterEach(cleanup);  // clean up the DOM after each test

describe("Verify UI state based on jobs", () => {
  it("mounts with no previous data", () => {
    const { getByTestId } = render(<Component data={[]} />);
    expect(getByTestId("refresh-button")).toBeDisabled();  // SUCCESS
  });

  it("mounts with previous data", () => {
    const { getByTestId } = render(<Component data={["hi"]} />);
    expect(getByTestId("refresh-button")).not.toBeDisabled();  // SUCCESS
  });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要使用Angular中的唯一值多次使用同一组件两次

来自分类Dev

在同一组件中映射和渲染两个不同的数组-React

来自分类Dev

如何为同一文件路径中的每个文件分别执行同一组命令?

来自分类Dev

gdb两次执行同一条语句

来自分类Dev

Airflow 两次执行同一个操作符

来自分类Dev

Blazor WebAssembly:同一组件渲染上的多条路线

来自分类Dev

如何使用ReactJS在同一组件内调用组件的属性?

来自分类Dev

在同一组件中从组件调用方法

来自分类Dev

按下按钮即可向同一组件加载不同的数据

来自分类Dev

使用同一组件在beforeRouteUpdate上未调用next()

来自分类Dev

QML属性绑定取决于同一组件中的其他绑定

来自分类Dev

聚合物:基于属性,同一组件的多个模板?

来自分类Dev

同一组件中的方法 - 自动更新

来自分类Dev

实例Angular 2组件两次

来自分类Dev

如何从同一组件分派多个动作?

来自分类Dev

React组件渲染两次且未触发useEffect

来自分类Dev

React组件渲染两次调用而未更改状态

来自分类Dev

StateHasChanged()两次重新渲染一次组件

来自分类Dev

React-当同一组件有多个实例时,如何更改单个组件的状态?

来自分类Dev

连续单击同一按钮两次时,按钮单击事件不会触发

来自分类Dev

单击一次按钮时,代码在 firebase onDatachange 中执行两次

来自分类Dev

更新两个状态变量时,该组件被渲染两次是否正常?

来自分类Dev

当 OpenShift 应该在 pod 内运行两个不同的容器时,它会运行同一个容器两次

来自分类Dev

反应条件渲染在一个地方工作,但不在同一组件中的另一个地方

来自分类Dev

如何两次对同一组记录进行排序,第二次排序独立于第一个排序?

来自分类Dev

如何在同一组件中多次使用自定义组件

来自分类Dev

jQuery:使用setTimeout时函数未执行两次

来自分类Dev

React类组件渲染两次

来自分类Dev

React组件被渲染两次

Related 相关文章

  1. 1

    需要使用Angular中的唯一值多次使用同一组件两次

  2. 2

    在同一组件中映射和渲染两个不同的数组-React

  3. 3

    如何为同一文件路径中的每个文件分别执行同一组命令?

  4. 4

    gdb两次执行同一条语句

  5. 5

    Airflow 两次执行同一个操作符

  6. 6

    Blazor WebAssembly:同一组件渲染上的多条路线

  7. 7

    如何使用ReactJS在同一组件内调用组件的属性?

  8. 8

    在同一组件中从组件调用方法

  9. 9

    按下按钮即可向同一组件加载不同的数据

  10. 10

    使用同一组件在beforeRouteUpdate上未调用next()

  11. 11

    QML属性绑定取决于同一组件中的其他绑定

  12. 12

    聚合物:基于属性,同一组件的多个模板?

  13. 13

    同一组件中的方法 - 自动更新

  14. 14

    实例Angular 2组件两次

  15. 15

    如何从同一组件分派多个动作?

  16. 16

    React组件渲染两次且未触发useEffect

  17. 17

    React组件渲染两次调用而未更改状态

  18. 18

    StateHasChanged()两次重新渲染一次组件

  19. 19

    React-当同一组件有多个实例时,如何更改单个组件的状态?

  20. 20

    连续单击同一按钮两次时,按钮单击事件不会触发

  21. 21

    单击一次按钮时,代码在 firebase onDatachange 中执行两次

  22. 22

    更新两个状态变量时,该组件被渲染两次是否正常?

  23. 23

    当 OpenShift 应该在 pod 内运行两个不同的容器时,它会运行同一个容器两次

  24. 24

    反应条件渲染在一个地方工作,但不在同一组件中的另一个地方

  25. 25

    如何两次对同一组记录进行排序,第二次排序独立于第一个排序?

  26. 26

    如何在同一组件中多次使用自定义组件

  27. 27

    jQuery:使用setTimeout时函数未执行两次

  28. 28

    React类组件渲染两次

  29. 29

    React组件被渲染两次

热门标签

归档