Jestjs 使用Jest在函数中测试函数?

Jestjs 使用Jest在函数中测试函数?,jestjs,Jestjs,我正在用笑话测试Redux操作创建者 这是操作创建者: const addDiscount=({code})=>(dispatch,getState)=>{ const{id}=getState().token; 退货({ 全部:折扣({ 正文:{ 代码 }, 身份证件 }), 类型:添加折扣。三元组 }); }; 这是我的测试: const apiCallMock=jest.fn(); const dispatch=jest.fn(()=>{ 返回{ apiCallMock }; }); c

我正在用笑话测试Redux操作创建者

这是操作创建者:

const addDiscount=({code})=>(dispatch,getState)=>{
const{id}=getState().token;
退货({
全部:折扣({
正文:{
代码
},
身份证件
}),
类型:添加折扣。三元组
});
};
这是我的测试:

const apiCallMock=jest.fn();
const dispatch=jest.fn(()=>{
返回{
apiCallMock
};
});
const customerOrderId='客户订单id';
const getState=jest.fn(()=>({
代币:{
客户订单
}
}));
const res=addDiscount({code:'abc123'})(dispatch,getState);
控制台日志(res);
console.log(dispatch.mock.calls[0][0]);
log(apiCallMock.mock);
如果我尝试
console.log(res)
则结果是
未定义

console.log(dispatch.mock.calls[0][0])显示类型,但apiCall是一个尚未运行的函数


console.log(apiCallMock.mock)似乎尚未运行

以下是仅使用jest的单元测试解决方案:

index.ts

从“/discount”导入{discount};
导出常量添加折扣={
三胞胎:“三胞胎”
};
export const addDiscount=({code})=>(dispatch,getState)=>{
const{id}=getState().token;
退货({
apiCall:discount.put({body:{code},id}),
类型:添加折扣。三元组
});
};
折扣.ts

export const折扣={
put(obj){
返回obj;
}
};
索引规范ts

从“/”导入{addDiscount,ADD_DISCOUNT};
从“./discount”导入{discount};
描述('addDiscount',()=>{
测试('should',()=>{
const customerOrderId='客户订单id';
const mDispatch=jest.fn();
const mGetState=jest.fn().mockReturnValueOnce({token:{id:customerOrderId}});
const putSpy=jest.spyOn(折扣,'put');
addDiscount({code:'abc123'})(mDispatch,mGetState);
expect(mGetState)。tobecalledtime(1);
期望(mDispatch)。使用({
apiCall:{body:{code:'abc123'},id:customerOrderId},
类型:添加折扣。三元组
});
expect(putSpy).toBeCalledWith({body:{code:'abc123'},id:customerOrderId});
});
});
100%覆盖率的单元测试结果:

PASS src/stackoverflow/55936794/index.spec.ts(9.651s)
附加折扣
✓ 应正确调度操作(7毫秒)
-------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
-------------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
折扣:100 | 100 | 100 | 100 | 100 ||
index.ts | 100 | 100 | 100 | 100 ||
-------------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:11.79秒

源代码:

无需调用apiCallMock,您的模拟调度将返回一个具有属性函数的对象。