Syn*_*nia 5 reactjs react-test-renderer react-testing-library
我对查询元素何时/如何更新感到困惑。例如:
我有一个可以计数的按钮。当数到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>
);
};
Run Code Online (Sandbox Code Playgroud)
我正在像这样测试它:
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);
});
Run Code Online (Sandbox Code Playgroud)
测试失败并出现以下错误:
expect(received).toBe(expected)
Expected value to be (using ===):
null
Received:
<button>2</button>
Run Code Online (Sandbox Code Playgroud)
为什么按钮元素知道其文本内容已更改?我们不需要在每次点击后运行queryByText("1")and 。queryByText("2")
为什么它不知道按钮在最后一次单击后已被卸载?queryByText("3")如果我们想检查它是否确实为空,我们确实需要这样做。
这是代码沙箱: https://codesandbox.io/s/react-testing-library-demo-76zhi
小智 2
我想这与react-dom和jsdom(也用于测试)的工作原理有关。
(如果猜测不可接受,请纠正我或告诉我!我会删除它。)
返回的按钮类型queryByText是HtmlElment
react或者react-dom只是最小化 dom 操作的任务,最终jsdom仍然会进行文本更改和按钮删除工作。
由于使用了测试工具jsdom,我检查了removeChild部分代码,并认为它们遵循W3C规范。我假设在 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);Run Code Online (Sandbox Code Playgroud)
<div id='btnContainer'><button id='btn'>0<button></div>Run Code Online (Sandbox Code Playgroud)
div,btn变量仍然是[object HTMLButtonElement]
也许它类似于使用splice包含已定义对象的数组,初始 obj 仍然保持不变?const obj = { 'a': 1};
const arr = [obj];
arr[0]['a'] = 2;
arr.splice(0, -1);
console.log(obj)Run Code Online (Sandbox Code Playgroud)
因此,我认为更多的是关于垃圾收集在 javascript 中如何工作。
另外,也许不要重复使用查询结果,而总是在这种情况下再次查询,结果会更符合预期。
PS我发现有一个方法调用toBeInTheDocument!
| 归档时间: |
|
| 查看次数: |
10241 次 |
| 最近记录: |