Jestjs 当用Jest/酶模拟useEffect时,“import*as”为什么从';反应有工作,但没有?

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},您将不会导入模拟函数,

我用Jest的spyOn模拟方法测试了react redux的
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