spyOn HTMLElement onClick 处理程序

spyOn HTMLElement onClick handler

我想检查 a link 标签是否可点击。 所以我 spyOn HTMLElement.click,但 toBeCalled 让我显示错误。

我是不是做错了方法?

假设我的 link 标签如下所示

import MySomeAPI from "./API";
const SomeComponent = () => {


 return (
    <a herf="#" onClick={() => {
     MySomeAPI.call()
     // this is synchronous call
     }}
    >
    text
    </a>
 )
}

const { queryByTestId } = render(<SomeComponent {...props} />);

const linkTag = getByTestId("someLink");
// I checked linkTag gives me HTMLElement


const spy = jest.spyOn(linkTag, "click");
userEvent.click(linkTag);
expect(spy).toBeCalled()

一个可能的答案是 spyOn MySomeAPI.call,并检查它是否被调用。 但是,我想如果我能完全监视 onClick 处理程序会更好。

如果你不能访问它,你就不能监视它。 onClick 是在函数组件范围内定义的匿名函数。它是私有的,你无法在调用方获取它(在测试用例中)。

此外,监视点击事件处理程序并检查它是否被调用,更多地关注实现细节。不推荐这种测试策略。相反,您应该测试组件的行为。

您应该测试:当用户单击按钮时,您的组件发生了什么变化。例如。组件呈现什么视图?

您可以模拟 MySomeAPI.call 等副作用方法及其 resolved/rejected 值以进行单元测试。 API调用returns后,设置组件状态,并根据状态渲染对应的view。

你应该测试这些。