-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
Copy pathtest-hook.js
77 lines (73 loc) · 1.94 KB
/
test-hook.js
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
import React, {useState, useEffect} from 'react'
import 'jest-dom/extend-expect'
import {testHook, cleanup, act} from '../'
afterEach(cleanup)
test('testHook calls the callback', () => {
const spy = jest.fn()
testHook(spy)
expect(spy).toHaveBeenCalledTimes(1)
})
test('confirm we can safely call a React Hook from within the callback', () => {
testHook(() => useState())
})
test('returns a function to unmount component', () => {
let isMounted
const {unmount} = testHook(() => {
useEffect(() => {
isMounted = true
return () => {
isMounted = false
}
})
})
expect(isMounted).toBe(true)
unmount()
expect(isMounted).toBe(false)
})
test('returns a function to rerender component', () => {
let renderCount = 0
const {rerender} = testHook(() => {
useEffect(() => {
renderCount++
})
})
expect(renderCount).toBe(1)
rerender()
expect(renderCount).toBe(2)
})
test('accepts wrapper option to wrap rendered hook with', () => {
const ctxA = React.createContext()
const ctxB = React.createContext()
const useHook = () => {
return React.useContext(ctxA) * React.useContext(ctxB)
}
let actual
testHook(
() => {
actual = useHook()
},
{
// eslint-disable-next-line react/display-name
wrapper: props => (
<ctxA.Provider value={3}>
<ctxB.Provider value={4} {...props} />
</ctxA.Provider>
),
},
)
expect(actual).toBe(12)
})
test('returns result ref with latest result from hook execution', () => {
function useCounter({initialCount = 0, step = 1} = {}) {
const [count, setCount] = React.useState(initialCount)
const increment = () => setCount(c => c + step)
const decrement = () => setCount(c => c - step)
return {count, increment, decrement}
}
const {result} = testHook(useCounter)
expect(result.current.count).toBe(0)
act(() => {
result.current.increment()
})
expect(result.current.count).toBe(1)
})