javascript - 测试 react.js 应用程序时无法将鼠标事件发送到选定元素
问题描述
尝试测试带有事件处理程序的基本反应组件onClick
。当通过jest.fn()
测试失败时expect(myComponent).toHaveBeenCalledTimes(1)
。我正在尝试通过以下方式模拟用户点击:
const button = document.querySelector("#calcButton");
button.dispatchEvent(new MouseEvent("click", { bubbles: true }));
完整代码如下。
该应用程序在 prod 和 dev 中正常document.querySelector("#calcButton").dispatchEvent(new MouseEvent("click", { bubbles: true }));
工作,并在 chrome 控制台中工作。
编辑:如果我替换dispatchEvent(...)
为.click()
. 传入console.log("Call back activated")
表明clicked
回调确实被调用了。
// calculate-button.test.js
import React from "react";
import { act } from "react-dom/test-utils";
import { render, unmountComponentAtNode } from "react-dom";
import Button from "react-bootstrap/Button";
import CalculateButton from "./calculate-button";
let container = null;
beforeEach(() => {
// setup a DOM element as a render target
container = document.createElement("div");
document.body.appendChild(container);
});
// Omitted afterEach and some other tests. The problem occurs with them commented out.
it("fires event when clicked.", () => {
const clicked = jest.fn();
act(() => {
render(<CalculateButton onClick={clicked} />, container);
});
const button = document.querySelector("#calcButton");
console.log(button); // Output indictates button is being selected as hoped.
act(() => {
button.dispatchEvent(new MouseEvent("click", { bubbles: true }));
});
expect(clicked).toHaveBeenCalledTimes(1);
// This is where the error happens.
});
//calculate-button.js
import React from "react";
import Button from "react-bootstrap/Button";
function calculateButton(props) {
return (
<Button
variant="primary"
size="lg"
id="calcButton"
block
onClick={props.handleClick}
>
Calculate!
</Button>
);
}
export default calculateButton;
的结果npm test
● Console
console.log src/components/calculate-button/calculate-button.test.js:36
HTMLButtonElement {
'__reactInternalInstance$vwtourl9fj':
FiberNode {
tag: 5,
key: null,
elementType: 'button',
type: 'button',
stateNode: [Circular],
return:
...OMITTED...
● fires event when clicked.
expect(jest.fn()).toHaveBeenCalledTimes(expected)
Expected number of calls: 1
Received number of calls: 0
39 | });
40 |
> 41 | expect(clicked).toHaveBeenCalledTimes(1);
| ^
42 | });
43 |
at Object.toHaveBeenCalledTimes (src/components/calculate-button/calculate-button.test.js:41:19)
Test Suites: 1 failed
解决方案
弄清楚了。感谢所有的帮助。
在calculate-button.js
我参考onClick={props.handleClick}
中,但在calculate-button.test.js
我传递mockClickHandler
的prop
onClick
. 通过更改render(<CalculateButton onClick={clicked} />, container);
为render(<CalculateButton hadleClick={clicked} />, container);
修复来更改不匹配。
这就是我草率命名的结果。再次感谢。
推荐阅读
- javascript - jQuery $(element).css('gap') 在 Firefox 中不起作用
- r - 在R中拆分每小时时间序列
- sql - SQL - 从值列表更新行
- javascript - Javascript 文本效果适用于 Firefox,但不适用于 Chrome
- reactjs - 反应哨兵 normalizeDepth 工作不正确
- reactjs - 如何将 React 组件导入另一个组件
- pandas - Jupyter Notebook 仍在截断 pandas 列
- javascript - 在悬停时播放视频的最佳资源?
- javascript - TypeError:无法读取未定义 ReactJS 的属性“地图”我是新手
- sql - SQL 错误:ORA-00905:缺少关键字 00905。00000 - 使用大小写时“缺少关键字”