javascript - 在 catch 块中测试 console.log
问题描述
我有以下代码:
loggerManager.js:
export default log(message) {
try {
axios.post(...).catch(error) { console.log(error); }
}catch(error) {
console.log(error);
}
}
loggerManager.test.js:
test('', () => {
jest.spyOn(global.console, 'log');
jest.mock('axios');
axios.post = jest.fn(() => Promise.reject('fail'));
log('message');
expect(console.log).toBeCalledWith('fail'); // The result said it has not been called even once
});
我哪里错了?
解决方案
两个问题:
拒绝处理程序将拒绝转换为履行,如果它没有
throw
或返回一个被拒绝的承诺try
/catch
不会捕获 Promise 拒绝,除非 Promiseawait
在try
块内被使用
所以假设正常情况下,如果你axios.post
的承诺被拒绝,拒绝处理程序会运行,但catch
块不会。
在这段代码中:
export default log(message) {
try {
axios.post(...).catch(error) { console.log(error); }
}catch(error) {
console.log(error);
}
}
只有在以下情况下,执行才会catch
在最后进入块:
axios
是一个未声明的标识符;或者axios
没有post
财产;或者axios.post
不是函数;或者axios.post
调用时抛出;或者axios.post
不返回具有catch
属性的对象;或者catch
对象返回的属性axios.post
不是函数;或者- 对象的
catch
方法在axios.post
调用时返回 throws
如果返回一个被拒绝的承诺,它将不会被输入。axios.post
你可能想要这个:
export default async log(message) {
// −−−−−−−−−−−−^^^^^
try {
await axios.post(...);
// −^^^^^
}catch(error) {
console.log(error);
}
}
这样,如果catch
调用有问题axios.post
或axios.post
返回被拒绝的承诺,则将进入该块。
推荐阅读
- ajax - 为什么 ajax 请求 POST 数据不能通过(在 cakePHP 中)?
- apache-spark - Spark groupby 多列分别
- mockito - 是否可以在不添加新方法进行验证的情况下对 onSubscribe 中发生的在 onComplete/onError 中撤消的列表添加/删除进行单元测试?
- r - dplyr NSE:在数据框中居中多列
- python - 将函数或类实例传递给 multiprocessing.Process 的“目标”参数是否安全,没有密集复制的风险?
- python - 创建一个字符串,列出查询集中对象类型的数量
- java - 我如何在java中使字符串居中
- javascript - 向特定用户或设备推送通知
- python - Python国际象棋验证移动
- javascript - 循环对象数组以返回正确的结果