unit.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { ComponentPublicInstance, nextTick } from 'vue';
  2. import { VueWrapper, DOMWrapper } from '@vue/test-utils';
  3. function getTouch(el: Element | Window, x: number, y: number) {
  4. return {
  5. identifier: Date.now(),
  6. target: el,
  7. pageX: x,
  8. pageY: y,
  9. clientX: x,
  10. clientY: y,
  11. radiusX: 2.5,
  12. radiusY: 2.5,
  13. rotationAngle: 10,
  14. force: 0.5
  15. };
  16. }
  17. export function trigger(
  18. wrapper: VueWrapper<ComponentPublicInstance<any, any, any>> | DOMWrapper<Element> | Element | Window,
  19. eventName: string,
  20. x = 0,
  21. y = 0,
  22. options: any = {}
  23. ) {
  24. const el = 'element' in wrapper ? wrapper.element : wrapper;
  25. const touchList = options.touchList || [getTouch(el, x, y)];
  26. if (options.x || options.y) {
  27. touchList.push(getTouch(el, options.x, options.y));
  28. }
  29. const event = document.createEvent('CustomEvent');
  30. event.initCustomEvent(eventName, true, true, {});
  31. Object.assign(event, {
  32. clientX: x,
  33. clientY: y,
  34. touches: touchList,
  35. targetTouches: touchList,
  36. changedTouches: touchList
  37. });
  38. el.dispatchEvent(event);
  39. return nextTick();
  40. }
  41. export async function mockScrollTop(value: number) {
  42. Object.defineProperty(window, 'scrollTop', { value, writable: true });
  43. trigger(window, 'scroll');
  44. return nextTick();
  45. }
  46. export function sleep(delay = 0): Promise<void> {
  47. return new Promise((resolve) => {
  48. setTimeout(resolve, delay);
  49. });
  50. }