跳至主要內容

useReducer

展示如何測試 useReducer Hook 的基本範例。最重要的是,我們不是直接測試 reducer - 它是元件的實作細節!相反,我們正在測試元件介面。

我們正在測試的元件會根據 isConfirmed 狀態更改一些文字。

// example.js

import React, {useReducer} from 'react'

const initialState = {
isConfirmed: false,
}

function reducer(state = initialState, action) {
switch (action.type) {
case 'SUCCESS':
return {
...state,
isConfirmed: true,
}
default:
throw Error('unknown action')
}
}

const Example = () => {
const [state, dispatch] = useReducer(reducer, initialState)

return (
<div>
<div>
{state.isConfirmed ? (
<p>Confirmed!</p>
) : (
<p>Waiting for confirmation...</p>
)}
</div>
<button onClick={() => dispatch({type: 'SUCCESS'})}>Confirm</button>
</div>
)
}

export default Example

我們正在測試以查看是否根據 reducer 狀態在 JSX 中獲得正確的輸出。

// example.test.js

import React from 'react'
import {render, fireEvent} from '@testing-library/react'
import Example from './example.js'

it('shows success message after confirm button is clicked', () => {
const {getByText} = render(<Example />)

expect(getByText(/waiting/i)).toBeInTheDocument()

fireEvent.click(getByText('Confirm'))

expect(getByText('Confirmed!')).toBeInTheDocument()
})