使用匹配器
普通匹配器
toBe
:测试值的方法是看是否精确匹配,相反的匹配器是.not.toBe
;toEqual
: 递归检查对象或数组的每个字段
Truthiness
toBeNull
toBeUndefined
toBeDefine
toBeTruthy: 匹配任何 if 语句为真
toBeFalsy: 匹配任何 if 语句为假
数字
大多数的比较数字有等价的匹配器。
1 | test('two plus two', () => { |
对于比较浮点数相等,使用 toBeCloseTo 而不是 toEqual,因为你不希望测试取决于一个小小的舍入误差。
1 | test('两个浮点数字相加', () => { |
字符串
您可以检查对具有toMatch
正则表达式的字符串︰
1 | test('there is no I in team', () => { |
数组
你可以检查数组是否包含特定子项使用 toContain︰
1 | const shoppingList = [ |
例外
如果你想要测试的特定函数抛出一个错误,在它调用时,使用 toThrow。
1 | function compileAndroidCode() { |
测试异步代码
回调
使用单个参数调用 done,而不是将测试放在一个空参数的函数。 Jest会等done回调函数执行结束后,结束测试。
1 | test('the data is peanut butter', done => { |
如果 done()永远不会调用,这个测试将失败,这也是你所希望发生的。
Promises
1 | test('the data is peanut butter', () => { |
一定要返回 Promise - 如果你省略 return 语句,您的测试将在 fetchData 完成之前完成。如果你想要 Promise 被拒绝,使用 .catch 方法。 请确保添加 expect.assertions 来验证一定数量的断言被调用。 否则一个fulfilled态的 Promise 不会让测试失败︰
1 | test('the fetch fails with an error', () => { |
.resolves / .rejects
您还可以使用 .resolves 匹配器在您期望的声明,Jest 会等待这一 Promise 来解决。如果 Promise 被拒绝,则测试将自动失败。
1 | test('the data is peanut butter', () => { |
如果你想要 Promise 被拒绝,使用 .catch 方法。 它参照工程 .resolves 匹配器。 如果 Promise 被拒绝,则测试将自动失败。
1 | test('the fetch fails with an error', () => { |
Async/Await
1 | test('the data is peanut butter', async () => { |
钩子函数
为多次测试重复设置
1 | beforeEach(() => { |
一次性设置
在某些情况下,你只需要在文件的开头做一次设置。 当这种设置是异步行为时,可能非常恼人,你不太可能一行就解决它。 Jest 提供 beforeAll 和 afterAll 处理这种情况。
1 | beforeAll(() => { |
作用域
默认情况下,before 和 after 的块可以应用到文件中的每个测试。 此外可以通过 describe 块来将测试分组。 当 before 和 after 的块在 describe 块内部时,则其只适用于该 describe 块内的测试。
比如说,我们不仅有一个城市的数据库,还有一个食品数据库。我们可以为不同的测试做不同的设置
1 | // Applies to all tests in this file |
1 | beforeAll(() => console.log('1 - beforeAll')); |
desribe和test块的执行顺序
Jest在执行任何实际测试之前执行所有描述处理程序的测试文件。这是在before*
和after*
的处理程序中进行设置和拆卸的另一个原因,而不是在描述块中,一旦描述块完成,默认情况下,Jest将按照它们在收集阶段遇到的顺序依次运行所有测试,等待每个测试完成并在继续之前进行整理。
1 | describe('outer', () => { |
通用建议
如果测试失败,第一件要检查的事就是,当仅运行这条测试时,它是否仍然失败。 在 Jest 中很容易地只运行一个测试 — — 只需暂时将 test 命令更改为 test.only:
1 | test.only('this will be the only test that runs', () => { |
如果你有一个测试,当它作为一个更大的用例中的一部分时,经常运行失败,但是当你单独运行它时,并不会失败,所以最好考虑其他测试对这个测试的影响。 通常可以通过修改 beforeEach 来清除一些共享的状态来修复这种问题。 如果不确定某些共享状态是否被修改,还可以尝试在 beforeEach 中 log 数据来 debug。
Mock函数
1 | const mockCallback = jest.fn(); |
.mock 属性
1 | const myMock = jest.fn(); |
1 | // The function was called exactly once |
Mock 的返回值
1 | const myMock = jest.fn(); |
1 | const filterTestFn = jest.fn(); |
Mocking Modules
1 | // users.test.js |
Mock 实现
1 | const myMockFn = jest.fn(cb => cb(null, true)); |
1 | // foo.js |
1 | const myMockFn = jest |
1 | onst myMockFn = jest |
1 | const myObj = { |
Mock 名称
1 | const myMockFn = jest |
自定义匹配器
1 | // 这个 mock 函数至少被调用一次 |
1 | // 这个 mock 函数至少被调用一次 |
Jest平台工具
您可以挑选Jest的特定功能,并将它们作为独立软件包使用。以下是可用软件包的列表:
jest-changed-files
用于识别git / hg存储库中已修改文件的工具。出口两个功能:
getChangedFilesForRoots 返回一个承诺,解析为更改后的文件和回购对象。
findRepos 返回一个承诺,解析为包含在指定路径中的一组存储库。
1 | const {getChangedFilesForRoots} = require('jest-changed-files'); |
jest-diff
用于可视化数据更改的工具
1 | const diff = require('jest-diff'); |
jest-docblock
1 | const {parseWithComments} = require('jest-docblock'); |
jest-get-type
1 | const getType = require('jest-get-type'); |
jest-validate
用于验证用户提交的配置的工具
1 | const {validate} = require('jest-validate'); |
jest-worker
用于任务并行化的模块
1 | // heavy-task.js |
1 | // main.js |
pretty-format
导出一个将任何JavaScript值转换为可读的字符串的函数。支持所有内置的JavaScript类型,并允许通过用户定义的插件扩展特定于应用程序的类型。
1 | const prettyFormat = require('pretty-format'); |