util.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import Vue from 'vue';
  2. import Element from 'main/index.js';
  3. Vue.use(Element);
  4. let id = 0;
  5. const createElm = function() {
  6. const elm = document.createElement('div');
  7. elm.id = 'app' + ++id;
  8. document.body.appendChild(elm);
  9. return elm;
  10. };
  11. /**
  12. * 回收 vm
  13. * @param {Object} vm
  14. */
  15. exports.destroyVM = function(vm) {
  16. vm.$destroy && vm.$destroy();
  17. vm.$el &&
  18. vm.$el.parentNode &&
  19. vm.$el.parentNode.removeChild(vm.$el);
  20. };
  21. /**
  22. * 创建一个 Vue 的实例对象
  23. * @param {Object|String} Compo 组件配置,可直接传 template
  24. * @param {Boolean=false} mounted 是否添加到 DOM 上
  25. * @return {Object} vm
  26. */
  27. exports.createVue = function(Compo, mounted = false) {
  28. if (Object.prototype.toString.call(Compo) === '[object String]') {
  29. Compo = { template: Compo };
  30. }
  31. return new Vue(Compo).$mount(mounted === false ? null : createElm());
  32. };
  33. /**
  34. * 创建一个测试组件实例
  35. * @link http://vuejs.org/guide/unit-testing.html#Writing-Testable-Components
  36. * @param {Object} Compo - 组件对象
  37. * @param {Object} propsData - props 数据
  38. * @param {Boolean=false} mounted - 是否添加到 DOM 上
  39. * @return {Object} vm
  40. */
  41. exports.createTest = function(Compo, propsData = {}, mounted = false) {
  42. if (propsData === true || propsData === false) {
  43. mounted = propsData;
  44. propsData = {};
  45. }
  46. const elm = createElm();
  47. const Ctor = Vue.extend(Compo);
  48. return new Ctor({ propsData }).$mount(mounted === false ? null : elm);
  49. };
  50. /**
  51. * 触发一个事件
  52. * mouseenter, mouseleave, mouseover, keyup, change, click 等
  53. * @param {Element} elm
  54. * @param {String} name
  55. * @param {*} opts
  56. */
  57. exports.triggerEvent = function(elm, name, ...opts) {
  58. let eventName;
  59. if (/^mouse|click/.test(name)) {
  60. eventName = 'MouseEvents';
  61. } else if (/^key/.test(name)) {
  62. eventName = 'KeyboardEvent';
  63. } else {
  64. eventName = 'HTMLEvents';
  65. }
  66. const evt = document.createEvent(eventName);
  67. evt.initEvent(name, ...opts);
  68. elm.dispatchEvent
  69. ? elm.dispatchEvent(evt)
  70. : elm.fireEvent('on' + name, evt);
  71. return elm;
  72. };
  73. /**
  74. * 触发 “mouseup” 和 “mousedown” 事件
  75. * @param {Element} elm
  76. * @param {*} opts
  77. */
  78. exports.triggerClick = function(elm, ...opts) {
  79. exports.triggerEvent(elm, 'mousedown', ...opts);
  80. exports.triggerEvent(elm, 'mouseup', ...opts);
  81. return elm;
  82. };
  83. /**
  84. * 触发 keydown 事件
  85. * @param {Element} elm
  86. * @param {keyCode} int
  87. */
  88. exports.triggerKeyDown = function(el, keyCode) {
  89. const evt = document.createEvent('Events');
  90. evt.initEvent('keydown', true, true);
  91. evt.keyCode = keyCode;
  92. el.dispatchEvent(evt);
  93. };