刘光辉
10 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
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
/* @vitest-environment happy-dom */
 
import { flushPromises, mount } from '@vue/test-utils';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { nextTick } from 'vue';
 
import CustomPrintPreviewPane from '../CustomPrintPreviewPane.vue';
 
vi.mock('ant-design-vue', async () => {
  const { defineComponent, h } = await import('vue');
 
  return {
    Button: defineComponent({
      name: 'AButton',
      emits: ['click'],
      setup(_, { emit, slots }) {
        return () => h('button', { type: 'button', onClick: () => emit('click') }, slots.default?.());
      },
    }),
    Empty: defineComponent({
      name: 'AEmpty',
      setup() {
        return () => h('div', { 'data-test': 'empty' });
      },
    }),
    Result: defineComponent({
      name: 'AResult',
      setup(_, { slots }) {
        return () => h('div', { 'data-test': 'result' }, slots.extra?.());
      },
    }),
    Spin: defineComponent({
      name: 'ASpin',
      setup() {
        return () => h('div', { 'data-test': 'spin' });
      },
    }),
  };
});
 
describe('CustomPrintPreviewPane', () => {
  afterEach(() => {
    vi.restoreAllMocks();
    vi.unstubAllGlobals();
  });
 
  it('does not emit stale loaded event after unmounting during html-file loading', async () => {
    let resolveFetch: (value: Response) => void = () => {};
    const fetchMock = vi.fn(
      () =>
        new Promise<Response>((resolve) => {
          resolveFetch = resolve;
        }),
    );
    vi.stubGlobal('fetch', fetchMock);
    const handleError = vi.fn();
    const handleLoaded = vi.fn();
    const handleLoading = vi.fn();
    vi.spyOn(console, 'error').mockImplementation(() => {});
 
    const wrapper = mount(CustomPrintPreviewPane, {
      props: {
        config: {
          data: {},
          template: 'print',
          type: 'html-file',
        },
        onError: handleError,
        onLoaded: handleLoaded,
        onLoading: handleLoading,
      },
    });
 
    await nextTick();
    expect(fetchMock).toHaveBeenCalled();
 
    wrapper.unmount();
    resolveFetch(new Response('', { status: 404 }));
    await flushPromises();
 
    expect(handleLoaded).not.toHaveBeenCalled();
    expect(handleError).not.toHaveBeenCalled();
    expect(handleLoading).toHaveBeenCalledWith(true);
  });
});