Skip to content

Commit 595b7f8

Browse files
committed
Changed custom hook example and test to be a simpler useCounter hook
1 parent c656268 commit 595b7f8

File tree

4 files changed

+58
-91
lines changed

4 files changed

+58
-91
lines changed

README.md

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -59,72 +59,56 @@ Using this library, you do not have to concern yourself with how to construct, r
5959
## Example
6060

6161
```js
62-
// useTheme.js
63-
import { useState, createContext, useContext, useMemo } from 'react'
62+
// useCounter.js
63+
import { useState } from 'react'
6464

65-
const themes = {
66-
light: { primaryLight: '#FFFFFF', primaryDark: '#000000' },
67-
dark: { primaryLight: '#000000', primaryDark: '#FFFFFF' }
68-
}
65+
function useCounter(initialCount = 0) {
66+
const [count, setCount] = useState(initialCount)
6967

70-
const ThemesContext = createContext(themes)
68+
const incrementBy = useCallback((n) => setCount(count + n), [count])
69+
const decrementBy = useCallback((n) => setCount(count - n), [count])
7170

72-
const useTheme = (initialTheme) => {
73-
const themes = useContext(ThemesContext)
74-
const [theme, setTheme] = useState(initialTheme)
75-
const toggleTheme = () => {
76-
setTheme(theme === 'light' ? 'dark' : 'light')
77-
}
78-
return useMemo(() => ({ ...themes[theme], toggleTheme }), [theme])
71+
return { count, incrementBy, decrementBy }
7972
}
73+
74+
export default useCounter
8075
```
8176

8277
```js
83-
// useTheme.test.js
78+
// useCounter.test.js
8479
import { renderHook, cleanup, act } from 'react-hooks-testing-library'
80+
import useCounter from './useCounter'
8581

86-
describe('custom hook tests', () => {
87-
afterEach(cleanup)
88-
89-
test('should use theme', () => {
90-
const { result } = renderHook(() => useTheme('light'))
82+
afterEach(cleanup)
9183

92-
const theme = result.current
84+
test('should create counter', () => {
85+
const { result } = renderHook(() => useCounter())
9386

94-
expect(theme.primaryLight).toBe('#FFFFFF')
95-
expect(theme.primaryDark).toBe('#000000')
96-
})
87+
expect(result.current.count).toBe(0)
88+
})
9789

98-
test('should update theme', () => {
99-
const { result } = renderHook(() => useTheme('light'))
90+
test('should increment counter', () => {
91+
const { result } = renderHook(() => useCounter())
10092

101-
const { toggleTheme } = result.current
93+
act(() => result.current.incrementBy(1))
10294

103-
act(() => toggleTheme())
95+
expect(result.current.count).toBe(1)
10496

105-
const theme = result.current
97+
act(() => result.current.incrementBy(2))
10698

107-
expect(theme.primaryLight).toBe('#000000')
108-
expect(theme.primaryDark).toBe('#FFFFFF')
109-
})
99+
expect(result.current.count).toBe(3)
100+
})
110101

111-
test('should use custom theme', () => {
112-
const customThemes = {
113-
light: { primaryLight: '#AABBCC', primaryDark: '#CCBBAA' },
114-
dark: { primaryLight: '#CCBBAA', primaryDark: '#AABBCC' }
115-
}
102+
test('should decrement counter', () => {
103+
const { result } = renderHook(() => useCounter())
116104

117-
const wrapper = ({ children }) => (
118-
<ThemesContext.Provider value={customThemes}>{children}</ThemesContext.Provider>
119-
)
105+
act(() => result.current.decrementBy(1))
120106

121-
const { result } = renderHook(() => useTheme('light'), { wrapper })
107+
expect(result.current.count).toBe(-1)
122108

123-
const theme = result.current
109+
act(() => result.current.decrementBy(2))
124110

125-
expect(theme.primaryLight).toBe('#AABBCC')
126-
expect(theme.primaryDark).toBe('#CCBBAA')
127-
})
111+
expect(result.current.count).toBe(-3)
128112
})
129113
```
130114

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"babel-eslint": "^10.0.1",
4444
"babel-plugin-module-resolver": "^3.2.0",
4545
"codecov": "^3.2.0",
46-
"eslint": "^5.15.1",
46+
"eslint": "^5.15.2",
4747
"eslint-config-prettier": "^4.1.0",
4848
"eslint-plugin-prettier": "^3.0.1",
4949
"husky": "^1.3.1",

test/customHook.test.js

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,45 @@
1-
import React, { useState, createContext, useContext, useMemo } from 'react'
1+
import { useState, useCallback } from 'react'
22
import { renderHook, cleanup, act } from 'src'
33

44
describe('custom hook tests', () => {
5-
const themes = {
6-
light: { primaryLight: '#FFFFFF', primaryDark: '#000000' },
7-
dark: { primaryLight: '#000000', primaryDark: '#FFFFFF' }
8-
}
5+
function useCounter(initialCount = 0) {
6+
const [count, setCount] = useState(initialCount)
97

10-
const ThemesContext = createContext(themes)
8+
const incrementBy = useCallback((n) => setCount(count + n), [count])
9+
const decrementBy = useCallback((n) => setCount(count - n), [count])
1110

12-
const useTheme = (initialTheme) => {
13-
const themes = useContext(ThemesContext)
14-
const [theme, setTheme] = useState(initialTheme)
15-
const toggleTheme = () => {
16-
setTheme(theme === 'light' ? 'dark' : 'light')
17-
}
18-
return useMemo(() => ({ ...themes[theme], toggleTheme }), [theme])
11+
return { count, incrementBy, decrementBy }
1912
}
2013

2114
afterEach(cleanup)
2215

23-
test('should use theme', () => {
24-
const { result } = renderHook(() => useTheme('light'))
25-
26-
const theme = result.current
16+
test('should create counter', () => {
17+
const { result } = renderHook(() => useCounter())
2718

28-
expect(theme.primaryLight).toBe('#FFFFFF')
29-
expect(theme.primaryDark).toBe('#000000')
19+
expect(result.current.count).toBe(0)
3020
})
3121

32-
test('should update theme', () => {
33-
const { result } = renderHook(() => useTheme('light'))
22+
test('should increment counter', () => {
23+
const { result } = renderHook(() => useCounter())
3424

35-
const { toggleTheme } = result.current
25+
act(() => result.current.incrementBy(1))
3626

37-
act(() => toggleTheme())
27+
expect(result.current.count).toBe(1)
3828

39-
const theme = result.current
29+
act(() => result.current.incrementBy(2))
4030

41-
expect(theme.primaryLight).toBe('#000000')
42-
expect(theme.primaryDark).toBe('#FFFFFF')
31+
expect(result.current.count).toBe(3)
4332
})
4433

45-
test('should use custom theme', () => {
46-
const customThemes = {
47-
light: { primaryLight: '#AABBCC', primaryDark: '#CCBBAA' },
48-
dark: { primaryLight: '#CCBBAA', primaryDark: '#AABBCC' }
49-
}
34+
test('should decrement counter', () => {
35+
const { result } = renderHook(() => useCounter())
5036

51-
const wrapper = ({ children }) => (
52-
<ThemesContext.Provider value={customThemes}>{children}</ThemesContext.Provider>
53-
)
37+
act(() => result.current.decrementBy(1))
5438

55-
const { result } = renderHook(() => useTheme('light'), { wrapper })
39+
expect(result.current.count).toBe(-1)
5640

57-
const theme = result.current
41+
act(() => result.current.decrementBy(2))
5842

59-
expect(theme.primaryLight).toBe('#AABBCC')
60-
expect(theme.primaryDark).toBe('#CCBBAA')
43+
expect(result.current.count).toBe(-3)
6144
})
6245
})

0 commit comments

Comments
 (0)