Blame view

test/unit/util.js 2.63 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
  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);
  };
  
  /**
db1b716f   Sergio Crisostomo   Add more DatePick...
61
62
63
64
65
66
67
68
69
70
   * Transform Date string (yyyy-mm-dd hh:mm:ss) to Date object
   * @param {String}
   */
  exports.stringToDate = function(str) {
    const parts = str.split(/[^\d]/).filter(Boolean);
    parts[1] = parts[1] - 1;
    return new Date(...parts);
  };
  
  /**
9b6ff1ce   huixisheng   add test and upda...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
   * 触发一个事件
   * 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...
96
97
98
99
100
101
102
103
104
105
  
  /**
  * 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);
  };