Skip to content

Commit 2b2b89f

Browse files
author
lmhcoding
committed
Merge branch 'test-useResize'
2 parents f8e4178 + 360cc06 commit 2b2b89f

File tree

3 files changed

+115
-6
lines changed

3 files changed

+115
-6
lines changed

src/useDebounceFn.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ export function useDebounceFn<T extends (...rest: any[]) => any>(fn: T, delay =
55
const debounceValue = useDebounce(0, delay)
66
let params: Parameters<T>
77

8-
watch(debounceValue, () => {
9-
fn(...params)
10-
})
11-
return (...rest: Parameters<T>) => {
8+
watch(
9+
debounceValue,
10+
() => {
11+
fn(...params)
12+
},
13+
{ flush: 'sync' }
14+
)
15+
return function (...rest: Parameters<T>) {
1216
params = rest
1317
debounceValue.value++
1418
}

tests/useDebounceFn.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { nextTick } from 'vue'
21
import { useDebounceFn } from '../src/useDebounceFn'
32

43
let callback: (...rest: any[]) => any
@@ -42,7 +41,6 @@ test('callback should be called when timeout', async () => {
4241
debounceFn('1')
4342
debounceFn('2')
4443
jest.advanceTimersByTime(200)
45-
await nextTick()
4644
expect(callback!).toHaveBeenCalledTimes(1)
4745
expect(callback!).toHaveBeenCalledWith('2')
4846
})

tests/useResize.test.ts

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import { VueWrapper } from '@vue/test-utils'
2+
import { DeepReadonly, Ref } from 'vue'
3+
import { useResize, ResizeHandler } from '../src/useResize'
4+
import { invokeHook } from './util'
5+
6+
let handler: Function
7+
let wrapper: VueWrapper<any>
8+
let width: DeepReadonly<Ref<number>>
9+
let height: DeepReadonly<Ref<number>>
10+
11+
function patchWindow () {
12+
let width = 200
13+
let height = 300
14+
const originAdd = window.addEventListener
15+
const originRemove = window.removeEventListener
16+
const originDispatch = window.dispatchEvent
17+
const addEventListener = jest.fn(function (event, cb, options) {
18+
originAdd.call(addEventListener.mock.instances[0], event, cb, options)
19+
})
20+
const removeEventListener = jest.fn(function (event, cb, options) {
21+
originRemove.call(removeEventListener.mock.instances[0], event, cb, options)
22+
})
23+
window.addEventListener = addEventListener
24+
window.removeEventListener = removeEventListener
25+
Object.defineProperties(window, {
26+
innerWidth: {
27+
get () {
28+
return width
29+
}
30+
},
31+
innerHeight: {
32+
get () {
33+
return height
34+
}
35+
}
36+
})
37+
const dispatchEvent = jest.fn(function (e: Event) {
38+
if (e.type === 'resize') {
39+
width = 1000
40+
height = 700
41+
originDispatch.call(dispatchEvent.mock.instances[0], e)
42+
}
43+
})
44+
window.dispatchEvent = dispatchEvent as any
45+
return () => {
46+
width = 200
47+
height = 300
48+
}
49+
}
50+
51+
const reset = patchWindow()
52+
53+
function testResize (description: string, delay = 200) {
54+
describe(description, () => {
55+
beforeEach(() => {
56+
handler = jest.fn()
57+
jest.useFakeTimers()
58+
wrapper = invokeHook(() => {
59+
const res = useResize(handler as ResizeHandler, delay)
60+
width = res.width
61+
height = res.height
62+
})
63+
})
64+
65+
afterEach(() => {
66+
jest.useRealTimers()
67+
jest.clearAllMocks()
68+
})
69+
70+
afterEach(() => {
71+
reset()
72+
})
73+
test('window.addEventListener should be called when mounted', () => {
74+
expect(window.addEventListener).toHaveBeenCalledTimes(1)
75+
expect(window.addEventListener).toHaveBeenCalledWith('resize', expect.any(Function), undefined)
76+
})
77+
78+
test('width/height should not be undefined', () => {
79+
expect(width).toBeDefined()
80+
expect(height).toBeDefined()
81+
expect(width.value).toBe(200)
82+
expect(height.value).toBe(300)
83+
})
84+
85+
test('width / height should be changed when resized', () => {
86+
window.dispatchEvent(new Event('resize'))
87+
delay && jest.advanceTimersByTime(200)
88+
expect(width.value).toBe(1000)
89+
expect(height.value).toBe(700)
90+
})
91+
92+
test('callback should be called when resized', () => {
93+
window.dispatchEvent(new Event('resize'))
94+
delay && jest.advanceTimersByTime(200)
95+
expect(handler).toBeCalled()
96+
})
97+
98+
test('window.removeEventListener should be called when unmounted', () => {
99+
wrapper.unmount()
100+
expect(window.removeEventListener).toHaveBeenCalledTimes(1)
101+
expect(window.removeEventListener).toHaveBeenCalledWith('resize', expect.any(Function), undefined)
102+
})
103+
})
104+
}
105+
106+
testResize('test useResize with debounce')
107+
testResize('test useResize without debounce')

0 commit comments

Comments
 (0)