Blame view

test/unit/util.js 2.4 KB
9b6ff1ce   huixisheng   add test and upda...
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  import Vue from 'vue';
  import iView from '../../src/index';
  
  Vue.use(iView);
  
  let id = 0;
  
  const createElm = function() {
    const elm = document.createElement('div');
  
    elm.id = 'app' + ++id;
    document.body.appendChild(elm);
  
    return elm;
  };
  
  /**
   * 回收 vm
   * @param  {Object} vm
   */
  exports.destroyVM = function(vm) {
    vm.$el &&
    vm.$el.parentNode &&
    vm.$el.parentNode.removeChild(vm.$el);
  };
  
  /**
   * 创建一个 Vue 的实例对象
   * @param  {Object|String}  Compo   组件配置,可直接传 template
   * @param  {Boolean=false} mounted 是否添加到 DOM 
   * @return {Object} vm
   */
  exports.createVue = function(Compo, mounted = false) {
    const elm = createElm();
  
    if (Object.prototype.toString.call(Compo) === '[object String]') {
      Compo = { template: Compo };
    }
    return new Vue(Compo).$mount(mounted === false ? null : elm);
  };
  
  /**
   * 创建一个测试组件实例
   * @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
   */
  exports.createTest = function(Compo, propsData = {}, mounted = false) {
    if (propsData === true || propsData === false) {
      mounted = propsData;
      propsData = {};
    }
    const elm = createElm();
    const Ctor = Vue.extend(Compo);
    return new Ctor({ propsData }).$mount(mounted === false ? null : elm);
  };
  
  /**
   * 触发一个事件
   * mouseenter, mouseleave, mouseover, keyup, change, click 
   * @param  {Element} elm
   * @param  {String} name
   * @param  {*} opts
   */
  exports.triggerEvent = function(elm, name, ...opts) {
    let eventName;
  
    if (/^mouse|click/.test(name)) {
      eventName = 'MouseEvents';
    } else if (/^key/.test(name)) {
      eventName = 'KeyboardEvent';
    } else {
      eventName = 'HTMLEvents';
    }
    const evt = document.createEvent(eventName);
  
    evt.initEvent(name, ...opts);
    elm.dispatchEvent
      ? elm.dispatchEvent(evt)
      : elm.fireEvent('on' + name, evt);
  
    return elm;
  };
3b9de249   Sergio Crisostomo   Add simple unit t...
86
87
88
89
90
91
92
93
94
95
  
  /**
  * Wait for components inner async process, when this.$nextTick is not enough
  * @param {Function} the condition to verify before calling the callback
  * @param {Function} the callback to call when condition is true
  */
  exports.waitForIt = function waitForIt(condition, callback) {
    if (condition()) callback();
    else setTimeout(() => waitForIt(condition, callback), 50);
  };