reactjs - 当 Promise 被拒绝时,使用 react-testing-library 和 jest 的 ReactJS 单元测试用例
问题描述
我是 React 和 react-testing-library 的新手。我有以下组件,当 Promise 在服务调用中被拒绝时,我在编写单元测试用例时遇到问题:
const Hotels = () => {
const [names, setNames] = useState([]);
useEffect(() => {
ServiceComponent.get('http://example.com').then((response)=>{
setNames(response?.['names']?? null);
}).catch(err =>{
console.error(err);
});
}, []);
return(
<Names names={names}/>
)
}
export default Hotels;
我能够模拟 ServiceComponent 并测试成功的 Promise。但是,我无法为 catch 块编写测试用例:
catch(err =>{
console.error(err);
})
我试过使用
ServiceComponent.get.mockRejectedValue(new Error("error"));
但这也无济于事。
我是新来的反应和它的测试用例。
解决方案
有一种方法可以通过创建一个mock function
引发错误的方法来测试 catch 块,因为在 catch 块中,您没有向 UI 显示任何错误,例如显示发生了某些错误的弹出窗口/模式,您将不得不传递一个模拟函数,该函数将在调用 catch 块时触发,您可以通过检查是否触发了模拟函数来验证是否调用了 catch 块
import { get } from './service';
jest.mock('./service')
describe("<App />", () => {
it("check if catch function is called",() => {
const mockError = jest.fn();
get.mockImplementation(() => {
return new Promise((resolve, reject) => {
mockError();
throw new Error("its a error");
})
})
render(<App />);
expect(mockError).toBeCalledTimes(1);
})
});
推荐阅读
- html - 如何每行显示两个圆形按钮,而其上方的单个按钮则居中而不与下方的两个按钮保持间距,反之亦然?
- amazon-web-services - 在 EMR 上安装 JDBC 驱动程序以供 Sqoop 使用的正确方法是什么?
- python - 如何将 Matlab 函数代码转换为 Python 代码?
- node.js - StatusCodeError: [not_x_content_exception] 只能在某些 xcontent 字节或压缩的 xcontent 字节上调用压缩器检测
- excel - 循环到最后一行
- python - 可以设置“ufuncify”功能来接受复杂的输入吗?“输入类型不支持 ufunc 'wrapper_module_0'”错误
- spring - Spring Integration:如何对轮询建议进行单元测试
- powerbi - PowerBI Web Embed 有混合刷新数据
- asp.net-core-signalr - 仅向连接到 SignalR 中 2 个不同集线器的特定组中的特定用户发送消息
- c - 如何在 C 中返回具有动态多维数组的结构?