Reactjs React-使用jest/酶测试控制器组件

Reactjs React-使用jest/酶测试控制器组件,reactjs,testing,jestjs,enzyme,Reactjs,Testing,Jestjs,Enzyme,我有点走不通了,因为我不知道该如何测试这个特定的“组件”。基本上,我有一个控制器组件,它是一个顶级组件。它不接受任何道具,由管线组件渲染。控制器组件有几个函数,其中一些传递到子组件中,并由事件处理程序触发 此外,控制器组件使用附加到全局窗口对象的API。API接收一个回调函数,在方法运行后,当您调用API上的某些方法时,将调用该回调函数。现在,我不知道应该如何测试控制器。我已经测试了所有子组件,并验证了所有功能都正常工作,但是控制器组件中的一些功能对于测试它们是否正常工作至关重要 const M

我有点走不通了,因为我不知道该如何测试这个特定的“组件”。基本上,我有一个控制器组件,它是一个顶级组件。它不接受任何道具,由管线组件渲染。控制器组件有几个函数,其中一些传递到子组件中,并由事件处理程序触发

此外,控制器组件使用附加到全局窗口对象的API。API接收一个回调函数,在方法运行后,当您调用API上的某些方法时,将调用该回调函数。现在,我不知道应该如何测试控制器。我已经测试了所有子组件,并验证了所有功能都正常工作,但是控制器组件中的一些功能对于测试它们是否正常工作至关重要

const MyController = () => {
const [api, setApi] = useState(null)

useEffect(() => {
const globalApi = window.globalApi
setApi(globalApi)
init()
}, [])

function callBack(e) {
    console.log(e)
}

function init() {
        api.init(callBack)
}

function close() {
    api.close()
}

return (
    <MyComponent 
    close={close}
    />
)
constmycontroller=()=>{
常量[api,setApi]=useState(null)
useffect(()=>{
常量globalApi=window.globalApi
setApi(globalApi)
init()
}, [])
函数回调(e){
控制台日志(e)
}
函数init(){
api.init(回调)
}
函数关闭(){
api.close()
}
返回(
)
}

模拟您的api,看看它是否被调用 您可以从全局监视api调用(如果我正确阅读了您的代码)。然后您可以模拟实现它

const apiCall = jest.spyOn(global.globalApi, 'init').mockImplementation(jest.fn);
expect(apiCall).toHaveBeenCalled();
你可以做几个测试。检查其呼叫次数,应为您呼叫一次。并检查调用它的参数

注 在spy中使用
global
<代码>全局指窗口

额外测试
除了这些测试之外,我建议对浅层渲染进行快照,以确保渲染始终正常工作。

为什么要将api置于该状态,这似乎是不必要的。我确实将此与您的评论结合使用,非常感谢。我唯一还有问题的是检查类是否已实例化。API返回一个对象,该对象具有为不同属性定义的函数和类。它适用于“init”函数,但如果类已实例化,则不适用于监视。模拟api的返回值,不要在测试中测试第三方请求。而是设置一个通过和失败模拟。