It's always important to test your code, especially if you're open-sourcing it for others to use. In this video, we'll learn how to use react-hooks-testing-library
to write a few tests for our custom hook.
import { useState, useEffect } from 'react' export function useStarWarsQuote() { const [quote, setQuote] = useState('') const [loading, setLoading] = useState(false) useEffect(() => { async function getStarWarsQuote() { setLoading(true) // Get initial text const response = await fetch( 'https://starwars-quote-proxy-gi0d3x1lz.now.sh/api/randomQuote' ) const data = await response.json() const quote = data.starWarsQuote setQuote(quote) setLoading(false) } getStarWarsQuote() }, []) return { quote, loading } }
Test:
import { renderHook } from '@testing-library/react-hooks' import { useStarWarsQuote } from './' describe('useStarWarsQuote', () => { test('should return an object with the keys: loading, quote', () => { // result.current = the value returned by our hook const { result } = renderHook(() => useStarWarsQuote()) expect(result.current).toHaveProperty('loading') expect(result.current).toHaveProperty('quote') }) test('should set loading to true after initial call', () => { const { result } = renderHook(() => useStarWarsQuote()) expect(result.current.loading).toBe(true) }) test('should return a quote and set loading to false', async () => { // Add test here const { result, waitForNextUpdate } = renderHook(() => useStarWarsQuote()) await waitForNextUpdate() expect(typeof result.current.quote).toBe('string') expect(result.current.quote).not.toBe(null) expect(result.current.quote).not.toBe('') expect(result.current.loading).toBe(false) }) })