-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Jest单元测试配置和所遇问题解决办法 #22
Comments
你好,请问用过axios请求过 |
是不是接口只能通过 HTTPS 请求呢, 有示例代码吗 |
@liuzhongbao 你的图没传上来... |
@zy-zero 推荐 mock request 方法, 单测的时候不必真的发请求, 那样太慢了. 看下 |
Jest(https://jestjs.io/) 是由 Facebook 推出的一款优秀的测试框架, 它集成了断言+测试的功能, 无须组合其他工具即可实现单元测试
上手体验
首先需要安装 Jest.
npm i -D jest
创建源码目录
src
, 编写将要测试的方法创建测试目录
__test__
, 编写第一个测试用例在 package.json 中, 添加 scripts 测试命令,
"test": "jest"
执行

npm test
运行单元测试, 结果如下__test__
是 Jest 默认测试目录, 如需使用其他目录可以在配置文件中修改查看测试覆盖率
可以修改 Jest 配置启用覆盖率输出, 在根目录创建配置文件
jest.config.js
, 添加如下内容重新执行单元测试, 结果如下

同时在你的项目中会生成
coverage
目录, 这里面是 web 版的详细覆盖率报告我们先在 package.json 新增一个命令, 来快捷打开 web 版覆盖率报告

添加
"coverage": "open ./coverage/lcov-report/index.html"
执行
npm run coverage
查看报告添加 TypeScript 支持
首先, 将
add.js
修改为add.ts
将
add.test.js
修改为add.test.ts
新增
tsconfig.json
添加 TypeScript 配置使用 Jest 测试 TypeScript 代码需要借助
ts-jest
解析器安装依赖
npm i -D ts-jest typescript @types/jest
修改 Jest 配置文件, 将 ts 文件解析器设置为 ts-jest
重新执行
npm test
查看结果添加 React 支持
首先安装相关依赖
npm i --save react react-dom
npm i -D @types/react @types/react-dom
修改
tsconfig.json
添加 tsx 支持测试 React 代码, 还需要借助 enzyme(https://airbnb.io/enzyme/), 这是由 Airbnb 出的一个 React 测试工具
安装依赖
npm i -D enzyme enzyme-adapter-react-16 @types/enzyme @types/enzyme-adapter-react-16
新增一个 React 组件 Example
新增 Example 组件测试用例
执行

npm test -- __test__/Example.test.tsx
单独测试 Example 组件, 结果如下React 常用测试场景
传递和更新 props
新增一个有 props 的组件 Message
编写 Message 组件的测试用例
模拟触发事件
新增一个监听点击事件的组件 Count
编写 Count 组件的测试用例
实践中遇到的问题和解法
浏览器 API 不支持的情况
Jest 默认下是用 jsdom(https://github.com/jsdom/jsdom) 这个虚拟环境来运行测试的, 它是一个仿浏览器环境, 但是并不支持所有的浏览器 API, 比如
URL.createObjectURL
就是不支持的对于不支持的 API, 需要我们对其添加 faker function
注意, 一定要保证在调用 API 之前就已经注入了 polyfill, 比如某些模块可能包含自执行代码, 在 import 该模块的时候, 就开始调用 API 了, 所以需要将 polyfill 放在 import 之前
调用 setTimeout 的代码
还是以 Count 组件为例, 修改一下逻辑, 不再点击按钮时自增, 修改为 mounted 1000ms 后自增一次
要测试 setTimeout, 需要使用 Jest 提供的 faker timer
同时还要注意, 使用 faker timer 后, react-dom 要求将更新 state 的逻辑包在
act
方法中, 否则就会出现如下的警告信息Warning: An update to Count inside a test was not wrapped in act(...).
完整的测试用例如下所示
The text was updated successfully, but these errors were encountered: