メインコンテンツにスキップ

useReducer

useReducerフックをテストする方法を示す基本的な例。一番重要なことは、リデューサーを直接テストしないことです。リデューサーはコンポーネントの実装の詳細です! 代わりに、コンポーネントのインターフェイスをテストします。

テストするコンポーネントは、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

リデューサーの状態に基づいて、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()
})