Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 和酶开玩笑,为什么“toHaveBeenCalled”在我的反应成分测试中没有触发?_Reactjs_Typescript_Testing_Jestjs_Enzyme - Fatal编程技术网

Reactjs 和酶开玩笑,为什么“toHaveBeenCalled”在我的反应成分测试中没有触发?

Reactjs 和酶开玩笑,为什么“toHaveBeenCalled”在我的反应成分测试中没有触发?,reactjs,typescript,testing,jestjs,enzyme,Reactjs,Typescript,Testing,Jestjs,Enzyme,我正在React应用程序中进行单元测试,该应用程序验证传入的prop函数是否基于另一个props值被有条件地调用。我在我的应用程序中使用Typescript/Enzyme/Jest,并在我测试的组件周围使用Root包装器来注入Redux存储(并根据需要覆盖初始状态) 从“酶”导入{mount,ReactWrapper}; 从“React”导入React; 从“src/components/auth/Login”导入登录名; 从“src/Root”导入Root; 让包装:反应包装; 设defaul

我正在React应用程序中进行单元测试,该应用程序验证传入的prop函数是否基于另一个props值被有条件地调用。我在我的应用程序中使用Typescript/Enzyme/Jest,并在我测试的组件周围使用
Root
包装器来注入Redux存储(并根据需要覆盖初始状态)

从“酶”导入{mount,ReactWrapper};
从“React”导入React;
从“src/components/auth/Login”导入登录名;
从“src/Root”导入Root;
让包装:反应包装;
设defaultProps={
签名:jest.fn(),
令牌:null,
};
在每个之前(()=>{
包装=安装(
);
});
描述(“在支架上”,()=>{
描述(“如果没有向道具提供令牌”,()=>{
它(“将调用props.sign()函数”,()=>{
expect(defaultProps.sign).tohavebeincall();
});
});
});
当我运行测试时,
toHaveBeenCalled()
(以及
toBeCalled()
,两者都已尝试)未注册任何调用。但是,我提供了一个
console.log
语句,该语句在
sign()
函数存在的相同条件下被触发

从“React”导入React;
从“src/components/auth/types”导入{AuthState,JWT};
从“src/redux/auth”导入{signIn};
界面道具{
签名:()=>承诺;
令牌:null | JWT;
}
类登录扩展了React.Component{
/**
*在挂载时登录用户
*/
公共组件didmount():void{
如果(!this.props.token){
console.log(“到达这里”);
this.props.sign();
}
}
public render():JSX.Elemeent{
//…更多代码
}
}
常量MapStateTops=(状态:AuthState)=>{
返回{
令牌:state.auth.token;
};
};
导出默认连接(mapstatetops,{signIn})(登录);
我已经阅读了好几篇相关的文章,但是所有不同的配置都失败了,比如遍历酶来获得直接道具或者利用
spyOn

唯一不同的是,我将
登录
组件包装为
,但考虑到我可以看到
控制台。日志
被触发,这看起来像是在黑暗中完成的


有人能告诉我我做错了什么吗

您必须等待组件安装,因此:

it("will call the props.signIn() function", (done) => {
  setImmediate(() => {
    expect(defaultProps.signIn).toHaveBeenCalled();
    done()
  });
});

结果是我忘记通过
connect
功能中的
mapDispatchToProps
mapStateToProps
放置覆盖。这导致传入的
signIn
函数被文件中导入的
signIn
操作覆盖。使用
ownProps
更新并有条件地使用传入的值修复问题:

const-mapStateToProps=(state:AuthState,ownProps:Props)=>{
返回{
令牌:ownProps.token | | state.auth.token;
};
};
const mapDispatchToProps=(调度:ThunkDispatch,ownProps:Props)=>{
返回{
signIn:ownProps.signIn | |(()=>{返回调度(signIn())})
}
}
导出默认连接(mapStateToProps、mapDispatchToProps)(登录);

当您进行多个测试时,您可能无法获得准确的结果,正如您所声明的
sign:jest.fn(),
全局。您可能希望在每次之前更改它的引用。感谢您的回复,不幸的是,这不起作用。它仍在返回,没有触发呼叫。谢谢你的建议。酶在你的项目中被广泛使用了吗?它没有提供任何钩子来解决这个问题。如果你能使用
@testinglibrary/react
,那就更好了。你能试试浅包装器吗。你的根组件做什么?问题实际上是存储。我必须更新问题并添加答案。谢谢你的帮助。