# 细节
为了尽量模仿出和小程序相似的表现,会对一些细节实现作一些调整。
* [class 前缀化](#class-前缀化)
* [dom 接口模拟](#dom-接口模拟)
* [自定义组件路径](#自定义组件路径)
* [wx 对象](#wx-对象)
* [内置组件](#内置组件)
## class 前缀化
小程序中为了达到类似 web components 的效果,对于自定义组件中的 class 会进行前缀化处理,用于实现样式隔离。为了支持这个效果,在调用 [load](./api.md#loadcomponentpath-tagname-options--loaddefinition) 接口时传入 tagName 参数,这样在渲染自定义组件时会使用 tagName 作为 class 的前缀。默认 tagName 为 main,即前缀为 main。
假设自定义组件 comp 的模板为:
```html
123
```
```js
simulate.load('/comp') // 渲染出来的结果是 123
simulate.load('/comp', 'custom-comp') // 渲染出来的结果是 123
```
需要注意的是,当自定义组件里在 usingComponents 里引用了其他自定义组件的时候,是会默认声明 tagName,所以这种情况下都会进行 class 前缀化:
```json
{
"component": true,
"usingComponents": {
"other-comp": "./other"
}
}
```
这里的 other 组件在被渲染时就默认会以 other-comp 为 tagName,other 组件内的 class 就会被前缀化,加上前缀 other-comp。
## dom 接口模拟
因为搭建和渲染自定义组件树需要调用 dom 接口,所以需要在 node 端模拟出 dom 接口。假如你使用的是 [mocha](https://www.npmjs.com/package/mocha) 或者是其他一些没有提供 dom 模拟功能的测试框架的话,一个比较好的解决方式是使用 [jsdom](https://www.npmjs.com/package/jsdom) 库来进行模拟。假如你使用的是如 [jest](https://www.npmjs.com/package/jest) 等已内置 dom 模拟功能的测试框架的话,则直接使用即可。
> PS:推荐使用 jest 来搭配此工具集使用,jest 内部已集成 jsdom,通过配置 testEnvironment 字段的值为 jsdom 即可以类浏览器环境的方式来执行测试用例。
## 自定义组件路径
因为在此测试环境中没有小程序根路径的概念,所以取 load 方法中的 rootPath 参数作为根路径来进行计算,比如下述例子中的 usingComponents 字段:
```json
{
"component": true,
"usingComponents": {
"other-comp": "/components/other"
}
}
```
这种绝对路径写法的,它会从我们提供的根路径开始寻找对应组件;但是使用相对路径写法,则无需做任何处理:
```json
{
"component": true,
"usingComponents": {
"other-comp": "./other"
}
}
```
> PS:关于 rootPath 的设置,可查看[此文档](./api.md#options)
## wx 对象
小程序运行环境中会注入一个 wx 对象,上面提供各种接口以供开发使用。但是此测试环境是运行在 nodejs 上,不存在这些接口的底层实现,因此开发者在写测试用例时对于自己将要使用的接口进行模拟,例如:
```js
const simulate = require('miniprogram-simulate');
test('test some', () => {
wx.xxx = function() {
// do something
}
// 各种测试代码
})
```
对于接口需要返回的数据也可以开发者自行拟定,方便测试各种情况。
## 内置组件
像官方提供的 view、image 等都是内置组件,目前此测试环境中提供的内置组件都只做普通渲染,未实现任何功能,如果这些内置组件不满足你需求的话,可以自己重写内置组件来覆盖掉此测试环境中提供的内置组件,例如:
```js
simulate.load({
id: 'view',
tagName: 'wx-view',
template: '
',
})
```
这样便可覆盖掉此测试环境中提供的 view 内置组件。