Jestjs 当用Jest/酶模拟useEffect时,“import*as”为什么从';反应有工作,但没有?
我用Jest的spyOn模拟方法测试了react redux的Jestjs 当用Jest/酶模拟useEffect时,“import*as”为什么从';反应有工作,但没有?,jestjs,react-hooks,enzyme,Jestjs,React Hooks,Enzyme,我用Jest的spyOn模拟方法测试了react redux的useSelector,使用酶浅贴法。我的同事指出,我没有在我的组件中使用某种形式的ReactRedux.useSelector(),所以他不明白为什么模拟可以工作;他从威尔·奥克尔曼·瓦格纳(Will Ockelmann Wagner)的帖子中读到,这是一个具有useEffect的需求。《华盛顿邮报》如此声明: 这里需要注意的一点是,如果您按照文档建议的方式从“React”导入React,{useffect},您将不会导入模拟函数,
useSelector
,使用酶浅贴法。我的同事指出,我没有在我的组件中使用某种形式的ReactRedux.useSelector()
,所以他不明白为什么模拟可以工作;他从威尔·奥克尔曼·瓦格纳(Will Ockelmann Wagner)的帖子中读到,这是一个具有useEffect
的需求。《华盛顿邮报》如此声明:
这里需要注意的一点是,如果您按照文档建议的方式从“React”导入React,{useffect},您将不会导入模拟函数,并且您的测试仍将失败。但是,如果您只在组件中使用React.useffect
,一切都会正常工作
一、 由于对存在差异的原因感到困惑,克隆了威尔的回购协议,并对其进行了进一步测试。它确实不起作用,除非我注意到,react-redux
没有默认的导出,这就是为什么我必须将它作为import*作为react-redux从'react-redux'
导入的原因。因此,我在我的测试文件中使用React:import*尝试了与React from'React'
相同的方法!模拟工作完美,我不需要改变我的任何一个组件!我想纯粹是运气使然,react redux
强迫我使用*作为obj
导入方法
不过,我的问题是,为什么它们都不起作用?我尝试打印两种导入方法的React
对象,唯一的区别是*作为obj
导入方法有一个额外的default
属性,它只是原始React
对象的副本
此外,Jest的文件说明:
jest.spyOn(对象,方法名)
创建类似于jest.fn
的模拟函数,但也跟踪对对象[methodName]
的调用
嗯。因此,这意味着只要useffect
方法在React
对象中,它就会模拟useffect
。嗯,React
来自import React…
确实包含useffect
,那么为什么Jest不能监视它呢
下面是两个React
对象的两个打印输出,具体取决于导入方法:
import React from'React'
和import React,{useffect}from'React'
反应:{
儿童:{
map:[函数:mapChildren],
forEach:[函数:forEachChildren],
count:[函数:countChildren],
toArray:[函数:toArray],
仅:[函数:onlyChild]
},
组件:[功能:组件],
碎片:符号(react.Fragment),
探查器:符号(react.Profiler),
PureComponent:[函数:PureComponent],
StrictMode:符号(react.strict_mode),
悬念:符号(反应。悬念),
__秘密内部不使用或你将被解雇:{
ReactCurrentDispatcher:{current:null},
ReactCurrentBatchConfig:{suspence:null},
ReactCurrentOwner:{current:null},
IsSomerEnderActing:{current:false},
分配:[函数:分配],
ReactDebugCurrentFrame:{getCurrentStack:null,GetStackAddition:[函数]},
ReactComponentTreeHook:{}
},
cloneElement:[函数:cloneElementWithValidation],
createContext:[函数:createContext],
createElement:[函数:createElementWithValidation],
createFactory:[函数:createFactoryWithValidation],
createRef:[函数:createRef],
forwardRef:[函数:forwardRef],
isValidElement:[函数:isValidElement],
lazy:[函数:lazy],
备注:[功能:备注],
useCallback:[函数:useCallback],
useContext:[函数:useContext],
useDebugValue:[函数:useDebugValue],
useEffect:[函数:useEffect],
UseImperialiveHandle:[函数:UseImperialiveHandle],
useLayoutEffect:[函数:useLayoutEffect],
useMemo:[功能:useMemo],
useReducer:[函数:useReducer],
useRef:[函数:useRef],
useState:[函数:useState],
版本:'16.13.1'
}
import*作为React from'React'
反应:{
儿童:{
map:[函数:mapChildren],
forEach:[函数:forEachChildren],
count:[函数:countChildren],
toArray:[函数:toArray],
仅:[函数:onlyChild]
},
组件:[功能:组件],
碎片:符号(react.Fragment),
探查器:符号(react.Profiler),
PureComponent:[函数:PureComponent],
StrictMode:符号(react.strict_mode),
悬念:符号(反应。悬念),
__秘密内部不使用或你将被解雇:{
ReactCurrentDispatcher:{current:null},
ReactCurrentBatchConfig:{suspence:null},
ReactCurrentOwner:{current:null},
IsSomerEnderActing:{current:false},
分配:[函数:分配],
ReactDebugCurrentFrame:{getCurrentStack:null,GetStackAddition:[函数]},
ReactComponentTreeHook:{}
},
cloneElement:[函数:cloneElementWithValidation],
createContext:[函数:createContext],
createElement:[函数:createElementWithValidation],
createFactory:[函数:createFactoryWithValidation],
createRef:[函数:createRef],
forwardRef:[函数:forwardRef],
isValidElement:[函数:isValidElement],
lazy:[函数:lazy],
备注:[功能:备注],
useCallback:[函数:useCallback],
useContext:[函数:useContext],
useDebugValue:[函数:useDebugValue],
useEffect:[函数:useEffect],
UseImperialiveHandle:[函数:UseImperialiveHandle],
useLayoutEffect:[函数:useLayoutEffect],
useMemo:[功能:useMemo],
useReducer:[函数:useReducer],
useRef:[函数:useRef],
useState:[函数:useState],
版本:“16.13.1”,
默认值:{//这是差异开始的地方
儿童:{
map:[函数:mapChildren],
forEach:[功能:forEac