element/test/unit/util.js

122 lines
2.9 KiB
Vue
Raw Normal View History

2016-10-25 13:35:41 +00:00
import Vue from 'vue';
2016-10-11 11:00:37 +00:00
import Element from 'main/index.js';
Vue.use(Element);
let id = 0;
const createElm = function() {
const elm = document.createElement('div');
elm.id = 'app' + ++id;
document.body.appendChild(elm);
return elm;
};
2016-10-24 11:01:55 +00:00
/**
* 回收 vm
* @param {Object} vm
*/
export const destroyVM = function(vm) {
vm.$destroy && vm.$destroy();
2016-10-24 11:01:55 +00:00
vm.$el &&
vm.$el.parentNode &&
vm.$el.parentNode.removeChild(vm.$el);
};
2016-10-11 11:00:37 +00:00
/**
* 创建一个 Vue 的实例对象
2016-10-17 08:32:20 +00:00
* @param {Object|String} Compo 组件配置可直接传 template
2016-10-11 11:00:37 +00:00
* @param {Boolean=false} mounted 是否添加到 DOM
* @return {Object} vm
*/
export const createVue = function(Compo, mounted = false) {
2016-10-17 08:32:20 +00:00
if (Object.prototype.toString.call(Compo) === '[object String]') {
Compo = { template: Compo };
}
2017-04-04 08:32:27 +00:00
return new Vue(Compo).$mount(mounted === false ? null : createElm());
2016-10-11 11:00:37 +00:00
};
/**
* 创建一个测试组件实例
* @link http://vuejs.org/guide/unit-testing.html#Writing-Testable-Components
* @param {Object} Compo - 组件对象
* @param {Object} propsData - props 数据
* @param {Boolean=false} mounted - 是否添加到 DOM
* @return {Object} vm
*/
export const createTest = function(Compo, propsData = {}, mounted = false) {
2016-10-17 08:32:20 +00:00
if (propsData === true || propsData === false) {
mounted = propsData;
propsData = {};
}
2016-10-11 11:00:37 +00:00
const elm = createElm();
const Ctor = Vue.extend(Compo);
return new Ctor({ propsData }).$mount(mounted === false ? null : elm);
};
2016-10-20 06:35:12 +00:00
/**
* 触发一个事件
2016-10-24 03:01:28 +00:00
* mouseenter, mouseleave, mouseover, keyup, change, click
2016-10-20 06:35:12 +00:00
* @param {Element} elm
2016-10-24 11:01:55 +00:00
* @param {String} name
* @param {*} opts
2016-10-20 06:35:12 +00:00
*/
export const triggerEvent = function(elm, name, ...opts) {
2016-10-21 08:14:14 +00:00
let eventName;
2016-10-24 03:01:28 +00:00
if (/^mouse|click/.test(name)) {
2016-10-21 08:14:14 +00:00
eventName = 'MouseEvents';
} else if (/^key/.test(name)) {
eventName = 'KeyboardEvent';
} else {
eventName = 'HTMLEvents';
}
const evt = document.createEvent(eventName);
2016-10-20 06:35:12 +00:00
evt.initEvent(name, ...opts);
elm.dispatchEvent
? elm.dispatchEvent(evt)
: elm.fireEvent('on' + name, evt);
2016-10-24 11:01:55 +00:00
return elm;
2016-10-20 06:35:12 +00:00
};
/**
* 触发 mouseup mousedown 事件
* @param {Element} elm
* @param {*} opts
*/
export const triggerClick = function(elm, ...opts) {
triggerEvent(elm, 'mousedown', ...opts);
triggerEvent(elm, 'mouseup', ...opts);
return elm;
};
2018-06-05 05:31:15 +00:00
/**
* 触发 keydown 事件
* @param {Element} elm
* @param {keyCode} int
*/
export const triggerKeyDown = function(el, keyCode) {
2018-06-05 05:31:15 +00:00
const evt = document.createEvent('Events');
evt.initEvent('keydown', true, true);
evt.keyCode = keyCode;
el.dispatchEvent(evt);
};
/**
* 等待 ms 毫秒返回 Promise
* @param {Number} ms
*/
export const wait = function(ms = 50) {
return new Promise(resolve => setTimeout(() => resolve(), ms));
};
/**
* 等待一个 Tick代替 Vue.nextTick返回 Promise
*/
export const waitImmediate = () => wait(0);