# 框架选择
可搭配大部分流行框架使用,只要其满足 js 运行环境和 dom 环境即可。以下简单介绍下 jest 和 karma:
## jest
1. 安装 jest 和配置参考 [jest 官网](https://jestjs.io/docs/zh-Hans/getting-started)
1. 配置 jest
```js
{
// jest 是直接在 nodejs 环境进行测试,使用 jsdom 进行 dom 环境的模拟。在使用时需要将 jest 的 `testEnvironment` 配置为 `jsdom`。
// jest 内置 jsdom,所以不需要额外引入。
"testEnvironment": "jsdom",
// 配置 jest-snapshot-plugin 从而在使用 jest 的 snapshot 功能时获得更加适合肉眼阅读的结构
"snapshotSerializers": ["miniprogram-simulate/jest-snapshot-plugin"]
}
```
具体的 jest 配置例子可参考 [weui-miniprogram 中的配置](https://github.com/wechat-miniprogram/weui-miniprogram/blob/unit-test/jest.config.js)
## karma
karma 可使用浏览器真实环境来运行测试用例,但是因为小程序自定义组件的文件是割裂的,而浏览器环境没有文件系统支持,因此需要做一些特殊处理。
安装 preprocessor:
```
npm install --save-dev karma-dirname-preprocessor karma-filemap-preprocessor karma-webpack
```
配置 karma.conf.js 中的 basePath、files、preprocessors、webpack 字段:
```js
module.exports = function(config) {
config.set({
// 其他配置 ......
basePath: path.resolve(__dirname, './test'), // 被测试组件所在根目录,因为编译器的限制,要求所有被测组件必须在此目录下
files: [
'node_modules/miniprogram-simulate/build.js', // 注入 miniprogram-simulate,会在 window 下挂载 simulate 对象
'test/spec/*.spec.js', // 测试用例
'src/component/*', // 组件文件,路径尽量不要包含 ../ 或者 ./,不然 wcc 编译器可能识别不了
],
preprocessors: {
'src/component/*': ['filemap'], // 组件文件使用 filemap 将各个文件内容注入到浏览器,路径尽量不要包含 ../ 或者 ./,不然 wcc 编译器可能识别不了
'test/spec/*.spec.js': ['webpack', 'dirname'], // 使用 webpack 进行打包,使用 dirname 处理测试用例中的 __dirname 变量
},
webpack: {
optimization: {
minimize: false, // 不做压缩,方便调试
},
node: {
__dirname: false, // 不注入 __dirname,由 preprocessor 来处理
},
},
// 其他配置 ......
})
}
```
然后测试用例如下方式来编写(以使用 mocha + chai 的方式为例):
```js
const path = require('path')
const expect = require('chai').expect
describe('component', () => {
it ('should run successfully', () => {
// 此处直接使用 simulate 或者 window.simulate 即可,不需要再做 require
const id = simulate.load(path.resolve(__dirname, '../src/component/index'))
const comp = simulate.render(id, {prop: 'index.test.properties'})
comp.attach(document.body) // 挂载在 body 下面
expect(simulate.match(comp.dom, '