Jestを使用して最初のReactコンポーネントをテストし、react-testing-library
Reactコンポーネントのテストを開始する最も簡単な方法は、スナップショットテストを実行することです。これは、コンポーネントを個別にテストできるテスト手法です。
ソフトウェアのテストに精通している場合は、クラスに対して行う単体テストと同じです。つまり、各コンポーネントの機能をテストします。
私はあなたがReactアプリを作成したと思いますcreate-react-app
、すでに付属しています冗談インストールされた、必要なテストパッケージ。
簡単なテストから始めましょう。 CodeSandboxは、これを試すのに最適な環境です。 Reactサンドボックスから始めて、App.js
のコンポーネントcomponents
フォルダを追加し、App.test.js
ファイル。
import React from 'react'
export default function App() {
return (
<div className=“App”>
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
)
}
私たちの最初のテストはばかげています:
test('First test', () => {
expect(true).toBeTruthy()
})
CodeSandboxがテストファイルを検出すると、自動的に実行されます。ビューの下部にある[テスト]ボタンをクリックして、テスト結果を表示できます。
テストファイルには、複数のテストを含めることができます。
Reactコンポーネントを実際にテストするために、もう少し便利なことをしてみましょう。現在はAppしかありませんが、実際には何もしていません。まず、以前に作成したカウンターアプリという、より多くの機能を備えた小さなアプリケーションで環境をセットアップしましょう。スキップした場合は、戻って作成方法を読むことができますが、参照しやすいように、ここにもう一度追加します。
アプリとボタンの2つのコンポーネントだけです。を作成しますApp.js
ファイル:
import React, { useState } from 'react'
import Button from './Button'
const App = () => {
const [count, setCount] = useState(0)
const incrementCount = increment => {
setCount(count + increment)
}
return (
<div>
<Button increment={1} onClickFunction={incrementCount} />
<Button increment={10} onClickFunction={incrementCount} />
<Button increment={100} onClickFunction={incrementCount} />
<Button increment={1000} onClickFunction={incrementCount} />
<span>{count}</span>
</div>
)
}
export default App
そしてそのButton.js
ファイル:
import React from 'react'
const Button = ({ increment, onClickFunction }) => {
const handleClick = () => {
onClickFunction(increment)
}
return <button onClick={handleClick}>+{increment}</button>
}
export default Button
を使用しますreact-testing-library
、これは、すべてのコンポーネントの出力を検査し、それらにイベントを適用できるため、非常に役立ちます。あなたはそれについてもっと読むことができますhttps://github.com/kentcdodds/react-testing-libraryまたは見てこのビデオ。
最初にButtonコンポーネントをテストしてみましょう。
インポートから始めますrender
そしてfireEvent
からreact-testing-library
、2人のヘルパー。 1つ目は、JSXをレンダリングします。 2つ目は、コンポーネントでイベントを発行できるようにします。
作成するButton.test.js
と同じフォルダに入れますButton.js
。
import React from 'react'
import { render, fireEvent } from 'react-testing-library'
import Button from './Button'
ボタンは、クリックイベントを受け入れるためにアプリで使用され、次に、に渡された関数を呼び出します。onClickFunction
小道具。追加しますcount
変数とそれをインクリメントする関数を作成します:
let count
const incrementCount = increment => {
count += increment
}
次に、実際のテストに移ります。最初にカウントを0に初期化し、レンダリングします+1
Button
コンポーネントを渡す1
にincrement
と私たちのincrementCount
機能するonClickFunction
。
次に、コンポーネントの最初の子のコンテンツを取得し、出力を確認します+1
。
次に、ボタンのクリックに進み、カウントが0から1になったことを確認します。
test('+1 Button works', () => {
count = 0
const { container } = render(
<Button increment={1} onClickFunction={incrementCount} />
)
const button = container.firstChild
expect(button.textContent).toBe('+1')
expect(count).toBe(0)
fireEvent.click(button)
expect(count).toBe(1)
})
同様に、+ 100ボタンをテストしますが、今回は出力を確認します。+100
and the button click increments the count of 100.
test('+100 Button works', () => {
count = 0
const { container } = render(
<Button increment={100} onClickFunction={incrementCount} />
)
const button = container.firstChild
expect(button.textContent).toBe('+100')
expect(count).toBe(0)
fireEvent.click(button)
expect(count).toBe(100)
})
それでは、Appコンポーネントをテストしてみましょう。 4つのボタンと結果がページに表示されます。各ボタンを調べて、ボタンをクリックしたときに結果が増加するかどうかを確認できます。複数回クリックすることもできます。
import React from 'react'
import { render, fireEvent } from 'react-testing-library'
import App from './App'
test(‘App works’, () => {
const { container } = render(<App />)
console.log(container)
const buttons = container.querySelectorAll(‘button’)
expect(buttons[0].textContent).toBe(’+1’)
expect(buttons[1].textContent).toBe(’+10’)
expect(buttons[2].textContent).toBe(’+100’)
expect(buttons[3].textContent).toBe(’+1000’)
const result = container.querySelector(‘span’)
expect(result.textContent).toBe(‘0’)
fireEvent.click(buttons[0])
expect(result.textContent).toBe(‘1’)
fireEvent.click(buttons[1])
expect(result.textContent).toBe(‘11’)
fireEvent.click(buttons[2])
expect(result.textContent).toBe(‘111’)
fireEvent.click(buttons[3])
expect(result.textContent).toBe(‘1111’)
fireEvent.click(buttons[2])
expect(result.textContent).toBe(‘1211’)
fireEvent.click(buttons[1])
expect(result.textContent).toBe(‘1221’)
fireEvent.click(buttons[0])
expect(result.textContent).toBe(‘1222’)
})
このCodeSandboxで動作するコードを確認してください。https://codesandbox.io/s/pprl4y0wq
私の無料ダウンロードReactハンドブック
その他の反応チュートリアル:
- Reactの簡単なアプリの例:APIを介してGitHubユーザー情報を取得する
- Reactでシンプルなカウンターを構築する
- React開発用のVSCodeセットアップ
- Reactルーターを介して小道具を子コンポーネントに渡す方法
- ElectronとReactでアプリを作成する
- チュートリアル:Reactを使用してスプレッドシートを作成する
- Reactを学ぶためのロードマップ
- Reduxの使い方を学ぶ
- JSXの使用を開始する
- スタイル付きコンポーネント
- ReduxSagaの紹介
- Reactルーターの紹介
- Reactの紹介
- コンポーネントを反応させる
- 仮想DOM
- Reactイベント
- 反応状態
- 小道具に反応する
- Reactフラグメント
- React Context API
- PropTypesに反応する
- Reactの概念:宣言型
- React:クリック時に別のコンポーネントを表示する方法
- ReactJSX内でループする方法
- 小道具とReactの状態
- jQueryまたはReactを使用する必要がありますか?
- Reactを使用するために知っておく必要のあるJavaScriptの量はどれくらいですか?
- ギャツビー入門
- ReactでDOM要素を参照する方法
- Reactにおける一方向のデータフロー
- 高次コンポーネントに反応する
- Reactライフサイクルイベント
- Reactのコンセプト:不変性
- Reactのコンセプト:純度
- Reactフックの紹介
- create-react-appの紹介
- Reactのコンセプト:構成
- React:プレゼンテーションコンポーネントとコンテナコンポーネント
- Reactでのコード分割
- Reactを使用したサーバー側のレンダリング
- Reactのインストール方法
- ReactのCSS
- ReactでのSASSの使用
- Reactでのフォームの処理
- React StrictMode
- Reactポータル
- Reactレンダリングプロップ
- Reactコンポーネントのテスト
- Reactのイベントハンドラーにパラメーターを渡す方法
- Reactでエラーを処理する方法
- JSXで複数の要素を返す方法
- Reactでの条件付きレンダリング
- React、小道具を子コンポーネントに転送する方法
- Reactで入力要素の値を取得する方法
- useStateReactフックの使用方法
- useCallbackReactフックの使用方法
- useEffectReactフックの使用方法
- useMemoReactフックの使用方法
- useRefReactフックの使用方法
- useContextReactフックの使用方法
- useReducerReactフックの使用方法
- Reactアプリを同じオリジンのバックエンドに接続する方法
- リーチルーターチュートリアル
- React開発ツールの使用方法
- Reactを学ぶ方法
- Reactアプリケーションをデバッグする方法
- ReactでHTMLをレンダリングする方法
- `dangerouslySetInnerHTML`を修正する方法がReactのエラーと一致しませんでした
- Reactログインフォームの状態とブラウザの自動入力に関する問題を修正する方法
- ローカルホスト上のReactアプリでHTTPSを構成する方法
- Reactの「別のコンポーネントのレンダリング中にコンポーネントを更新できない」エラーを修正する方法
- 条件内でReactフックを使用できますか?
- オブジェクトでのuseStateの使用:更新方法
- ReactとTailwindを使用してコードのブロックを移動する方法
- React、DOMに追加されたときにReactでアイテムにフォーカスします
- 反応、ダブルクリックでテキストを編集