Jest是由Facebook开发并维护的一套js的单元测试框架,之前在后台的nodejs项目里面第一次尝试使用,感觉还是非常容易上手的,功能也比较强大。尤其是mock方面也别好用,还天然的支持覆盖率,所以非常推荐使用。
内置支持的功能如下:
-
灵活的配置:比如,可以用文件名通配符来检测测试文件;
-
测试的事前步骤(Setup)和事后步骤(Teardown),同时也包括测试范围;
-
匹配表达式(Matchers):能使用期望expect句法来验证不同的内容;
-
测试异步代码:支持承诺(promise)数据类型和异步等待async / await功能;
-
模拟函数:可以修改或监查某个函数的行为;
-
手动模拟:测试代码时可以忽略模块的依存关系;
-
虚拟计时:帮助控制时间推移。
1 基本使用介绍
1.1 安装
1.2 一个简单的例子
被测试文件:sum.js
测试文件: sum.test.js
将下面的配置部分添加到你的 package.json 里面:
“scripts”: {
“test”: “jest”
}
执行下面的命令即可:
npm test
注意:jest会自动搜索路径下面所有test.js结尾的文件, 默认都会执行。
如果想单独运行某个测试文件可以直接加上文件名就可以。
如上面的例子可以:
npm test sum.test.js 或者jest sum.test.js
也可以在jest配置文件里配置上testRegex
testRegex默认值:(/
tests
/.*|(\.|/)(test|spec))\.jsx?$
1.3 Jest配置选项
可以参考:
https://facebook.github.io/jest/docs/en/configuration.html
里面,比较有用的就是collectCoverage 默认是false,设置成true的话执行完测试就会自动统计覆盖率。
1.4 jest命令行
除了用npm test 执行测试,也可以直接jest执行所有用例,jest支持的命令行参数可以参考:
https://facebook.github.io/jest/docs/zh-Hans/cli.html
命令行参数仅支持 jest 执行,npm test这样是不支持命令行的。
下面介绍比较常用的:
(1)——runInBand
jest –runInBand
可以顺序执行所有用例,默认所有用例是并行执行的。
(2)——debug
执行前打印jest所有配置信息。
2 Jest的mock技巧介绍
2.1 基本的mock
2.1.1 Mock一个函数
方法的mock 非常简单,使用jest.fn 就可以非常简单的mock一个函数。
如下面的例子:代码里面有一个函数叫forEach。
此函数可以简单使用下面方法mock,并且jest提供一些方法可以确保查看mock函数被调用的情况:
mock属性的所有api可以参考:
https://facebook.github.io/jest/docs/en/mock-function-api.html
2.1.2 Mock返回值
可以使用mock注入返回值,可以使用的api为mockReturnValue,mockReturnValueOnce等。
如下面的例子:
2.1.3 Mock内部实现
使用jest.fn或者mockImplementationOnce 可以完全替换需要mock的函数。
如下面的例子:
当需要mock的函数是从其他模块创建的就可以使用mockImplementation。
2.1.4 Mock名字
可以使用mockName 来给mock函数命名,如果没有命名,输出的日志默认就会打印jest.fn(),加上名字更有利于调试。
另外有用的mock方法可以参考:
https://facebook.github.io/jest/docs/en/mock-functions.html
2.2 模块的mock
这里面有几种方式来mock:
2.2.1 使用jest.mock自动mock
2.2.2 jest.mock()直接在单元测试里面mock 模块
例如我们很多产品代码里面会使用fs文件读取文件, 在单元测试中, 我们并不需要真去调用fs读取文件, 就可以考虑把fs模块mock掉, 如下代码:
**2.2.3 在需要mock的模块目录临近建立目录
mocks
这里面分两种情况:**
2.2.3.1 对于用户目录下面的模块
例如我们需要mock目录models下面的user模块,那么我们就需要在models下面新建
mocks
目录(这里要区分大小写),然后新建文件user.js。
注意:用这种方式, 需要在单元测试文件中需添加下面的代码才能使此mock生效。
2.2.3.2 对于node_modules下面的模块
如果我们需要mock的模块是一个Node的模块(如lodash
),那么
mocks
应该是挨着node_modules目录(除非你手动配置的 roots指向非本项目的root目录),这种就会自动mock了,也就是不需要在单元测试用例里再调用jest.mock(‘module_name’)。
如果需要mock的模块是scoped模块,那么我们创建的mock的名字需要一致,例如, mock模块名字为 @scope/project-name,那么就需要创建
mocks
/@scope/project-name.js。
注意:如果我们需要mock node的核心模块(如fs或者path),那么还是需要显示的调用jest.mock(‘path’) , 因为核心的node模块默然是不被mock的。
总结一下上面两种mock的目录应该如下:
2.3 类的mock
类可以用四种方式来mock一个类。
此部分我们使用下面的类来举例:
使用下列用例check下mock的执行情况:
2.3.1 jest.mock自动mock类所在的模块, 类和类的方法也自动被mock。
2.3.2 在
mock_
路径建立mock的文件:
2.3.3 使用带模块工厂参数的mock。
形式如下jest.mock(path, moduleFactory),其中模板工厂参数指的是一个返回模块的函数
2.3.4. 使用mockImplementation()或者mockImplementationOnce()代替mock
可以使用mockImplementation() (or mockImplementationOnce())代替上面的带模板工厂参数的mock方法,mockImplementation或者mockImplementationOnce来修改mock。
如下面的例子,在使用了mock之后,随时可以使用。
可以参考:
https://facebook.github.io/jest/docs/en/es6-class-mocks.html
对于简单的函数的mock,推荐使用jest.fn 来进行mock,针对不同的情况 (例如返回值或者替换实现),可以考虑使用mockReturnValue和mockImplementation;针对类和模块的mock,推荐使用自动的mock方法也就是jest.mock。对于比较复杂的类和接口,如果自动mock不能完成覆盖到的话,建议结合使用jest.mock和jest.fn().mockImplementation,或者可以使用jest.mock完全自己mock。
另外,jest里面有timer的mock,使用jest.useFakeTimers()可以自动mock代码里面的setTimeout和setInterval等函数具体信息请参考:
https://facebook.github.io/jest/docs/en/timer-mocks.html
。
关注腾讯移动品质中心TMQ,获取更多测试干货!
版权所属,禁止转载!!!
导读Jest是由Facebook开发并维护的一套js的单元测试框架,之前在后台的nodejs项目里面第一次尝试使用,感觉还是非常容易上手的,功能也比较强大。尤其是mock方面也别好用,还天然的支持覆盖率,所以非常推荐使用。内置支持的功能如下:灵活的配置:比如,可以用文件名通配符来检测测试文件;测试的事前步骤(Setup)和事后步骤(Teardown),同时也包括测试范围;匹配表达...
一
mock
函数
在测试中没有提供测试用的数据,那么可以
使用
jest
提供的
mock
函数,来捕获函数的调用。
const func =
jest
.fn(); //
mock
函数,捕获函数的调用
在
mock
函数里面包含了什么内容?我们可以通过console.log来查看
calls------ 函数被调用返回的结果
insta...
为什么要
使用
Mock
函数?
在项目中,
一个
模块的
方法
内常常会去调用另外
一个
模块的
方法
。在单元测试中,我们可能并不需要关心内部调用的
方法
的执行过程和结果,只想知道它是否被正确调用即可,甚至会指定该函数的返回值。此时,
使用
Mock
函数是十分有必要。
Jest
中的三个与
Mock
函数相关的API,分别是
jest
.fn()、
jest
.spyOn()、
jest
.
mock
().
jest
.fn
const my
Mock
=
jest
.fn();
conso
以第1节教程的创建的目录和代码为基础进行讲解。如果没有看过第1节教程,请关注我,查看以往该系列的文章
这节教程主要讲解
jest
中的
mock
函数,将第1节的代码复制一份,并且把index.js和index.test.js文件内容全部清空
mock
函数可以在你测试实际代码的时候,捕获对函数的调用以及参数和返回值等,也可以用于模拟一些数据
安装axios
npm run axios --sa...
转载React16
Jest
单元测试 之
Mock
Functions(
Mock
ing Modules 和
Mock
Implementations)项目初始化【这里
使用
之前的项目,节省时间】项目初始化地址https://github.com/durban89/webpack4-react16-reactrouter-demo.git
tag:v_1.0.21拉取git clone https:/...
一、js中有多个
方法
,只
mock
其中
一个
方法
const { commonUtil } = require("common")
commonUtil.getCode =
jest
.fn()
commonUtil.getCode.
mock
ImplementationOnce(() => { return {"base_url":"***"} })
如此在test时候,函数执行到commonUtil.getCode时,就会返回我们想要的结果。
二、
mock
整个
方法
const createSql = r
为什么会用到
Mock
?
Mock
能帮我们解决什么问题?
在项目中,
一个
模块的
方法
内常常会去调用另外
一个
模块的
方法
。在单元测试中,我们可能并不需要关心内部调用的
方法
的执行过程和结果,只想知道它是否被正确调用即可,甚至会指定该函数的返回值。此时,
使用
Mock
函数是十分有必要。
Mock
函数提供的以下三种特性,在我们写测试代码时十分有用:
- 擦除函数的实际实现(换句话说:改变函数的内部实现)
- 捕获函数调用情况( 包括:这些调用中