Blame view

test/unit/util.js 3.07 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);
  };
  
  /**
65255c96   Sergio Crisostomo   fix date formatti...
71
72
73
74
75
76
77
78
   * Transform Date to yyyy-mm-dd string
   * @param {Date}
   */
  exports.dateToString = function(d) {
    return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(nr => nr > 9 ? nr : '0' + nr).join('-');
  };
  
  /**
9b6ff1ce   huixisheng   add test and upda...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
   * 触发一个事件
   * 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...
104
105
106
107
108
109
110
111
112
113
  
  /**
  * 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);
  };
a8707afa   Sergio Crisostomo   Add tests for 1807
114
115
116
117
118
119
120
121
122
123
  
  /**
  * Call a components .$nextTick in a promissified way
  * @param {Vue Component} the component to work with
  */
  exports.promissedTick = component => {
    return new Promise((resolve, reject) => {
      component.$nextTick(resolve);
    });
  };