如何兼容 webpack
jest
并不知道 webpack
中的 alias
和 NormalModuleReplacementPlugin
是如何工作的,所以写了一个 resolver
来统一解决这个问题:
1 | const fs = require('fs') |
转换 yml 文件
项目中使用 yml
文件来配置接口,jest
并不知道如何处理,所以需要编写对应的 transform
,其作用跟 webpack
的 loader
类似。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var yaml = require('js-yaml')
module.exports = {
process (src, filename) {
var obj = yaml.safeLoad(src)
var apis = obj.apis
var config = obj.config
var defaultExport = {}
var output =
Object.keys(apis)
.map(function (name) {
var api = apis[name]
var url = api.url
var options = api.options
var needs = api.needs
var meta = api.meta
url = config.rootUrl ? config.rootUrl + url : url
options = Object.assign({}, config.options, options)
meta = Object.assign({}, config.meta, meta)
defaultExport[name] = {
name: name,
url: url,
options: options,
meta: meta,
needs: needs
}
return (
'exports.' +
name +
' = ' +
JSON.stringify(defaultExport[name]) +
';'
)
})
.join('') +
('module.exports = ' + JSON.stringify(defaultExport) + ';')
return output
}
}
如何对不同的国家做 snapshot 测试
首先,不同国家的测试文件必须要分不同的目录,就像这样:1
2
3
4
5
6
7
8
9├── __tests__
│ │ ├── id
│ │ │ ├── __snapshots__
│ │ │ ├── data.js
│ │ │ └── index.test-country.js // must end with ".test-country.js"
│ │ └── th
│ │ ├── __snapshots__
│ │ ├── data.js
│ │ └── index.test-country.js
接下来必须保证执行 npm run test:id
的时候,只跑 id 目录下的测试用例。很好办,在配置文件中这样配置即可:
1 | 'testMatch': [ |
统一时区
为了确保时区不同导致测试用例失败,需要统一时区,在测试脚本头部加入如下代码即可:1
process.env.TZ = 'Asia/Shanghai'
如何模拟事件
以 touchstart
事件为例:
1 | let e = new window.Event('touchstart') |
在测试 Picker
组件时,给滚动组件这个操作封装成了如下函数:
1 | const scrollPicker = (dom, startY, endY) => { |
如何模拟 getBoundingClientRect
Picker
组件中使用该函数来分别得到该组件以及每个可选内容的高度:
1 | const rootHeight = rootRef.getBoundingClientRect().height |
可以使用如下方法来模拟:
1 | const mockedRect = { |
对于多列的情况,比如 n 列,重复调用上面的两个方法 n 次然后赋值给 window.Element.prototype.getBoundingClientRect
即可。
触发 props 的更新
1 | const comp = mount( |
如上所示,onValueChange
触发后,变量 selectedValue
得到最新的值,但是 MultiPicker
的属性 selectedValue
并不能得到更新,所以需要我们去触发:
1 | <MultiPicker |
使用 redux-saga-test-plan
来测试 saga
使用 redux-saga-test-plan
来测试 saga 可以减少很多工作量。下面以一个复杂的例子来说明其用法:
1 | // saga.js |