gpt4 book ai didi

reactjs - 使用 react-testing-library 测试卸载

转载 作者:行者123 更新时间:2023-12-04 15:42:44 24 4
gpt4 key购买 nike

我对查询元素何时/如何更新感到困惑。例如:

我有一个计数的按钮。当它数到 3 时,它就消失了。

import React, { useState } from "react";

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

return (
<div>
{count < 3 && (
<button onClick={() => setCount(count + 1)}>{count}</button>
)}
</div>
);
};

我正在测试它:
test("Counter counts up and disappears", () => {
const { queryByText } = render(<App" />);

const button = queryByText("0");
expect(button.textContent).toEqual("0");

fireEvent.click(button);
expect(button.textContent).toEqual("1");

fireEvent.click(button);
expect(button.textContent).toEqual("2");

fireEvent.click(button);
expect(button).toBe(null);
});

测试失败并出现以下错误:
expect(received).toBe(expected)

Expected value to be (using ===):
null
Received:
<button>2</button>

为什么按钮元素知道它的文本内容发生了变化?我们不需要运行 queryByText("1")queryByText("2")每次点击后。

为什么它不知道在最后一次点击后按钮已被卸载?我们确实需要做 queryByText("3")如果我们想检查它确实为空。

这是代码沙箱:
https://codesandbox.io/s/react-testing-library-demo-76zhi

最佳答案

猜测这是关于如何react-domjsdom (也用于测试)有效。

(如果猜测 Not Acceptable ,请纠正我或让我知道!我将删除它。)

  • 按钮类型返回 queryByTextHtmlElment
  • reactreact-dom只是最小化dom操作的任务,最终jsdom仍然会进行文本更改和按钮删除工作。
  • 由于测试工具使用的是 jsdom ,我查了removeChild部分代码,相信they are following W3C specification .我假设在 dom 操作级别,jsdom会像浏览器一样工作。因此,我像这样模拟了您的代码:


  • const btn = document.getElementById('btn');
    const btnContainer = document.getElementById('btnContainer');

    btn.textContent = '1';
    console.log('btn after click 1: ' + btn);
    btn.textContent = '2';
    console.log('btn after click 2: ' + btn);
    btnContainer.removeChild(btn);
    console.log('btn after removed: '+ btn);
    <div id='btnContainer'><button id='btn'>0<button></div>


  • 如您所见,从 div 删除后, btn变量仍然是 [object HTMLButtonElement]也许它类似于使用 splice对于包含已定义对象的数组,初始 obj 仍然保持不变?


  • const obj = { 'a': 1};
    const arr = [obj];
    arr[0]['a'] = 2;
    arr.splice(0, -1);
    console.log(obj)



    因此,我认为更多的是关于 how garbage collection works in javascript .

    另外,可能不重用查询结果,一直在这种情况下再次查询,结果会更令人期待。

    附言我发现有一个方法调用 toBeInTheDocument !

    关于reactjs - 使用 react-testing-library 测试卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57195433/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com