# 为Node API写单元测试(Jest Mock)
# Mock
在单元测试里, 涉及到文件读写和网络请求的部分并不会调用真实的API去完成, 而是通过模拟(mock)出一段数据当作真实的结果. 按照惯例, 模拟的API需要放在__mocks__
文件夹里, 并且要在离调用API最近的地方:
这里以仿写fs.readFile
为例, 主要分为两大步: 首先模拟数据, 然后模拟API.
// fs.js const fs = jest.genMockFromModule('fs') // mock模块 const _fs = jest.requireActual('fs') // 引用真正的模块 Object.assign(fs, _fs) const mocks = {} // 模拟数据 fs.mockData = (path, err, data) => { mocks[path] = [err, data] } // 模拟readFile函数 fs.readFile = (path, options, callback) => { if (callback === undefined) callback = options if (mocks[path]) { callback(...mocks[path]) } else { _fs.readFile(path, options, callback) } } module.exports = fs
Copied!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Test
在这里, 我们可以使用mock api开始测试功能了:
jest.mock('fs') const fs = require('fs') describe('db', () => { it('should read', async function () { fs.mockData('/xxx', null, data) const result = await fs.readFile('/xxx') expect(result).toStrictEqual(data) }) })
Copied!
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10