React テスト 走り書き

テスト

ライブラリ

Jest or React-Testing-Library(RTL) or Mock Service Worker(MSW) (ちなみにCreateReactAppでプロジェクトを作った際には最初から入っている)

Jest

一般的なjavascriptのテストに利用

RTL

React用のテスティングライブラリでReactの機能のテストで利用

react-dom/test-utils

None Content

MSW

APIなどを利用したり非同期のテストをする際に利用

mock-require

None Content

cypress

E2Eテストに利用する。

提供されている機能

  • セットアップ/後処理 beforeEach, afterEachを使う例ではdomのマウントとアンマウントをしている。
  • act レンダー、ユーザイベント、データの取得といったタスクをする。 これらのタスクに関連する更新がすべて処理され、DOM に反映されていることを保証します。
  • render Componentの描画に使う。
  • APIのモック, モジュールのモック、イベントコール、タイマー 多分実際のサンプルを見た方が簡単に理解できる

一般的にテストすべきこと

静的テスト

NoContent

Unit test

NoContent

結合テスト

NoContent

E2E test

NoContent

その他メモ

トレードオフ テストツールを選定する時、いくつかのトレードオフを考慮することは価値があります。

実行速度 vs 環境の現実度: 変更を加えてから結果を見るまでのフィードバックが早いツールは、ブラウザでの動作を正確に模倣しません。一方実際のブラウザ環境を使うようなツールは、イテレーションの速度が落ちる上 CI サーバでは壊れやすいです。 モックの粒度 コンポーネントのテストでは、ユニットテストとインテグレーションテストの区別は曖昧です。フォームをテストする時、そのテストはフォーム内のボタンもテストすべきでしょうか。それともボタンコンポーネント自体が自身のテストを持つべきでしょうか。ボタンのリファクタリングはフォームのテストを壊さないべきでしょうか。 チームやプロダクトに応じて、答えは違ってきます。

推奨ツール Jest は jsdom を通じて DOM にアクセスできる JavaScript のテストランナーです。jsdom はブラウザの模倣環境にすぎませんが、React コンポーネントをテストするのには十分なことが多いです。Jest は モジュール や タイマー のモックのような機能を組み合わせて、高速にイテレーションを回すことができ、コードをどう実行するかをよりコントロールできます。

React Testing Library は実装の詳細に依存せずに React コンポーネントをテストすることができるツールセットです。このアプローチはリファクタリングを容易にし、さらにアクセシビリティのベスト・プラクティスへと手向けてくれます。コンポーネントを children 抜きに「浅く」レンダーする方法は提供していませんが、Jest のようなテストランナーで モック することで可能です。

一般的には、スナップショットを使うよりもより個別的なアサーションを行う方がベターです。

toHogeでの比較では関数を伴ったオブジェクトの比較はできない。

プロパティの受け渡しテスト。

expect(mockChildComponent).toHaveBeenCalledWith(
    expect.objectContaining({
      open: true,
      data: "some data",
    })
  );
// 一回しか呼ばれない時

expect(mockFn.mock.calls).toEqual([
  [arg1, arg2, ...], // First call
  [arg1, arg2, ...]  // Second call
]);
// 内部で複数回呼ばれる場合(リストアイテムとか)