【发布时间】:2021-07-15 20:19:35
【问题描述】:
不用说,这个应用程序比这个复杂得多,但要点是一样的。我无法对应用程序进行重大更改,例如导入/导出 onSuccess 函数或更改为基于类的组件。
单击按钮启动登录功能,我在其中传递了一个 onSuccess 功能。我想监视分析函数以确保它被调用,但在我的测试中我无法调用 onSuccess 函数
理想情况下,我想做这样的事情:
test("analyze should be called", () => {
let analyzeSpy = jest.spyOn(Analytics, "analyze");
onSuccess() //<- cannot do this
expect(analyzeSpy).toHaveBeenCalledTimes(1);
});
这是应用程序:
import Analytics from "./Analytics";
export function Login({ onLoginSuccess }) {
setTimeout(function () {
console.log("TIMEOUT OVER");
onLoginSuccess();
}, 2000);
}
function App() {
function handleClick() {
console.log("Login");
Login({
onLoginSuccess: onSuccess,
});
}
function onSuccess() {
console.log("Login success");
Analytics.analyze();
}
return (
<>
<button
onClick={() => {
handleClick();
}}
>
Login
</button>
</>
);
}
export default App;
这是 Analytics.js:
export default {
analyze: () => {
console.log("Analysis done");
},
};
我该如何测试?
【问题讨论】:
-
您要进行什么单元测试?你已经包含了几个文件、几个组件和几个函数?如果您想测试是否调用了
analyze,那么您需要渲染App并模拟单击按钮以启动回调链。需要明确的是,这不是单元测试,而是集成测试。 -
Login() 函数有一些依赖项,需要用户干预。也许我应该模拟登录功能。
-
如果你不是,那么你应该使用
react-testing-library,然后你渲染App组件,click按钮然后你会调用你的onSuccess来查看间谍是否被调用。
标签: javascript reactjs unit-testing testing jestjs