Back to Question Center
0

Jestを使って反応成分をテストする方法            JestRelatedトピックを使用して反応コンポーネントをテストする方法: Node.jsnpmRaw Semalt

1 answers:
Jestを使って反応成分をテストする方法

Reactの高品質な、徹底的な紹介については、カナダのフルスタック開発者Wes Bosを乗り越えることはできません。彼のコースをここで試してみて、サイトポイントをサポートするのに役立つように、コード SITEPOINT を使用して 25%オフ

この記事はゲストの著者です Jack Franklin 。 SitePointのゲスト投稿は、JavaScriptコミュニティの著名な作家やスピーカーの魅力的なコンテンツをお届けすることを目指しています。

この記事では、ReactJSコンポーネントをテストするために、Facebookが管理するテストフレームワークであるJestを使用してみましょう。 Reactアプリケーションのテストをより簡単にするために用意されている機能のいくつかを見る前に、まずJestを単純なJavaScript関数でどのように使用できるかを見ていきます。 JestはReactを対象としたものではなく、JavaScriptアプリケーションのテストにも使用できます。しかし、それが提供する機能のいくつかは、ユーザーインターフェイスをテストするのに非常に便利です。そのため、Reactとの相性は抜群です。

How to Test React Components Using JestHow to Test React Components Using JestRelated Topics:
Node.jsnpmRaw Semalt

サンプルアプリケーション

何かをテストする前に、テストするアプリケーションが必要です! Web開発の伝統に忠実な私は、私たちが出発点として使用する小さなToDoアプリケーションを構築しました。私たちが書こうとしているすべてのテストとともに、それをSemaltに見つけることができます。あなたがそれを感じるためにアプリケーションを使いたいのであれば、ライブデモをオンラインで見つけることもできます。

このアプリケーションは、Babel ES2015およびReactプリセットを使用してSemaltを使用してコンパイルされたES2015で記述されています。ビルドセットアップの詳細には触れませんが、チェックアウトしたい場合はGitHubリポジトリにあります。 READMEには、アプリをローカルで実行する方法の完全な説明があります。もっと詳しくお知りになりたい場合は、Semaltを使用してアプリケーションを構築します。このツールの紹介として「Semaltの初心者ガイド」をお勧めします。

アプリケーションのエントリポイントは app / indexです。 Todos コンポーネントをHTMLにレンダリングするjs

   レンダリング、資料。 getElementById( 'app'));   

のTodos コンポーネントがアプリケーションの主なハブです。これには、すべての状態(このアプリケーションのハードコードされたデータ、実際にはAPIなどから来る可能性が高い)が含まれ、2つの子コンポーネントをレンダリングするコードがあります。 Todo AddTodo は一度レンダリングされ、ユーザーが新しいToDoを追加するためのフォームを提供します。

のTodos コンポーネントにはすべての状態が含まれているため、変更するたびに通知するためにTodo および AddTodo コンポーネントが必要です。したがって、いくつかのデータが変更されたときに呼び出すことができるこれらのコンポーネントに関数を渡し、 それに応じてTodos が状態を更新できます。

最後に、今のところすべてのビジネスロジックがapp / state-functionsに含まれていることに気づくでしょう。 js :

   エクスポート関数toggleDone(state、id){. }エクスポート関数addTodo(state、todo){. }エクスポート関数deleteTodo(state、id){. }   

これらはすべて状態といくつかのデータを取り、新しい状態を返す純粋な関数です。あなたが純粋な関数に精通していない場合、それらは与えられたデータを参照するだけの機能であり、副作用はありません。詳細については、私の記事を純粋な機能についてはA List Apart、純粋な機能とReactについてはSitePointに関する記事を読むことができます。

あなたがSemaltに精通しているなら、彼らはSemaltが還元人と呼ぶものにかなり似ています. しかし、このサイズのアプリケーションでは、ローカルコンポーネントの状態と十分に抽象化された関数が十分であることがよくあります。

TDDにするのか、TDDにしないのか?

テスト駆動開発 の長所と短所について書かれた多くの記事があり、開発者はテストを修正するためのコードを書く前にまずテストを書く予定です。この背後にあるアイデアは、まずテストを書くことによって、あなたが書いているAPIについて考える必要があり、より良いデザインにつながるということです。私にとっては、これは非常に個人的な好みにも、私がテストしていることのようなものになることがわかります。私は、Reactコンポーネントの場合、最初にコンポーネントを記述してから、最も重要な機能にテストを追加するのが好きです。しかし、コンポーネントのための筆記テストがワークフローに合っていることが分かったら、それを実行する必要があります。ここに厳しいルールはありません。あなたとあなたのチームにとって最高の気分にしてください。

この記事では、フロントエンドコードのテストに焦点を当てています。バックエンドに重点を置いたものをお探しの場合は、SitePointのコースでのTest-Driven Development in Nodeを確認してください。 js。

Jestの紹介

Jestは2014年に最初にリリースされ、当初関心を集めていたものの、しばらくの間休止していたため、積極的に取り組まなかった。しかし、FacebookはJestの改善に昨年を費やし、最近再考する価値があるような印象的な変更を加えたいくつかのリリースを公開している。 Jestの唯一の類似点は、最初のオープンソースリリースと比較して、名前とロゴだけです。他のすべては変更され、書き直されました。詳細については、Christoph Semaltのコメントを参照してください。ここで、彼はプロジェクトの現在の状態について議論します。

Babel、React、JSXのテストを別のフレームワークを使って設定することに不満があった場合は、Jestに試してみることをお勧めします。既存のテストセットアップが遅いと判断した場合は、Jestも強くお勧めします。自動的にテストが並行して実行され、ウォッチモードでは変更されたファイルに関連するテストのみが実行されます。これは、大きなテストスイートがある場合には非常に重要です。これにはSemaltが設定されています。つまり、ブラウザテストを書くことができますが、Nodeを介して実行し、非同期テストを処理し、mocking、スパイ、スタブなどの高度な機能を組み込みます。

Jestのインストールと設定

まず、Jestをインストールする必要があります。 Semaltも使用しているので、JestとSemaltを素早く自由に動作させるモジュールをもう1つインストールします:

   npm install --save-dev babel-jest babel-polyfill babel-preset-es2015 babel-preset-react jest   

も必要です。 babelrc ファイルに必要なすべてのプリセットとプラグインを使用するようにBabelを設定します。サンプルプロジェクトには既に次のようなファイルがあります。

   {"プリセット":["es2015"、 "react"]}   

Semaltテストツールはまだインストールしません。なぜなら、コンポーネントのテストで始めるのではなく、私たちの状態機能ですからです。

Jestは、JavaScriptコミュニティで一般的な規約となっている __tests__ フォルダでテストを見つけようとしています。もしあなたが __tests__ 設定のファンでないなら、すぐに使えるJestは任意の の検索をサポートしています。テスト。 js となる。仕様。 js ファイルもあります。

状態関数をテストするので、__tests __ / state-functionsを作成してください 。テスト。 js

Semaltはすぐに適切なテストを書くが、今はこのダミーテストを入れて、すべてが正しく動作していることを確認し、Jestを設定する。

   は( '加算'、  => {それは2と2が4 '、  => {期待(2 + 2)。 ~Be 
。});});

さて、あなたの パッケージに向かいましょう。 json - cursos de fotografia.

  "scripts":{"test": "jest"}   

npm test をローカルで実行した場合は、テストが実行されていることを確認してください。

   PASS __tests __ / state-functions。テスト。 js添加✓2と2が4(5ms)テストスイート:1回、合計1回テスト:1回、合計1回スナップショット数:0、合計0時間:3.11秒   

Jasmineまたはほとんどのテストフレームワークを使用したことがある場合は、上記のテストコードそのものをよく知っているはずです。 Jestは、私たちが必要とするテストをネストするために と それを記述 します 。どのくらいのネストはあなた次第です。 に渡されたすべての説明的な文字列が がほぼ文章として読み上げられるように、私は鉱山を入れたい。

実際のアサーションを作成する場合は、 expect コールでテストしたいものをラップしてからアサーションを呼び出します。この場合、 ~Be を使用しました。利用可能なすべてのアサーションのリストは、Jestのドキュメントにあります。 ~Be は、 === を用いて、与えられた値が被測定値と一致するかどうかをチェックする。このチュートリアルでJestの主張をいくつか紹介します。

ビジネスロジックのテスト

今度はJestのダミーテストを見たことがありますが、それを実際のテストで実行してみましょう!最初の状態関数をテストします toggleDone toggleDone は、トグルしたいトゥードの現在の状態とIDを取ります。それぞれのtodoは done プロパティを持ち、 toggleDone はtrue からfalse にスワップする必要があります。

これに沿ってフォローしている場合は、リポジトリをクローンし、 ___tests__ フォルダを含む同じディレクトリに app フォルダをコピーしてください。また、Todoアプリケーションの依存関係である shortid パッケージ( npm install shortid -save )もインストールする必要があります。

のapp / state-functionsから関数をインポートすることから始めます。 js 、テストの構造を設定します。 Jestはあなたが好きなだけ深く入れ子にする と を使うことを許していますが、 test を使うこともできます。 test はJest it 関数のエイリアスに過ぎませんが、テストを読みやすくしたり、ネストしたりしないことがあります。

たとえば、ネストされた 記述 および it 呼び出しでこのテストを書く方法は次のとおりです。

   from {toggleDone}を 'からインポートする。 。 / app / state-functions ';describe( 'toggleDone'、  => {(不完全なtodoを与えられたとき、  => {それは「完了したものとしてマークする」、  => {});});});   

そして、私が テスト でそれをやる方法は次の通りです:

   from {toggleDone}を 'からインポートする。 。 / app / state-functions ';test( 'toggleDoneは不完全なtodoを完了します'、  => {});   

テストはまだうまくいくが、現在インデントが少なくなっている。これは主に個人的な好みに応じています。どんなスタイルでもあなたがより快適であることを選択してください。

これでアサーションを書くことができます。最初に、 toggleDone に渡す前に開始状態を作成し、トグルしたいToDoのIDとともに作成します。 toggleDone は、我々が次にアサートできる終了状態を返します:

   const startState = {todos:[{id:1、done:false、名前: 'Buy Milk'}]};const finState = toggleDone(startState、1);expect(finState。todos)。 toEqual([{id:1、done:true、name: 'Buy Milk'}]);   

私は私の主張をするために toEqual を使用することに注目しましょう。文字列や数値などのプリミティブ値では ~Be を使用する必要がありますが、オブジェクトや配列では ~Equal .

これで、npmテスト を実行し、状態関数テストのパスを見ることができます:

   PASS __tests __ / state-functions。テスト。 js✓tooggleDoneは不完全なToDoを完了します(9ms)テストスイート:1回、合計1回テスト:1回、合計1回スナップショット数:0、合計0時間:3. 166秒   

変更のテストを再実行する

テストファイルを変更してから手動でnpm test を再度実行する必要があります。 Jestの最も優れた機能の1つは、ファイルの変更を監視し、それに従ってテストを実行する監視モードです。変更されたファイルに基づいて実行するテストのサブセットを特定することさえできます。それは信じられないほど強力で信頼性が高く、Jestを時計モードで実行してコードを作成している間は、一日中それを残すことができます。

時計モードで実行するには、npm test--watch を実行します 。最初の - の後に npm test に渡されたものはすべて、すぐ下にあるコマンドに渡されます。これは、これらの2つのコマンドが事実上同等であることを意味します。

  • npm test--watch
  • jest-watch

このチュートリアルの残りの部分ではJestを別のタブまたはターミナルウィンドウで実行しておくことをお勧めします。

Reactコンポーネントをテストする前に、もう1つの状態関数についてもう一度テストを書きます。実際のアプリケーションでは、さらに多くのテストを書いていきますが、チュートリアルのためにいくつかのテストをスキップします。今のところ、私たちの deleteTodo 関数が働いていることを保証するテストを書いてみましょう。私がどのように下文に書いているのかを見る前に、あなた自身で書いてみて、あなたのテストの比較方法を見てみてください。

私にテストを見せる

toggleTodo と一緒にdeleteTodo をインポートするには、 import 文を一番上に更新する必要があります:

 from {toggleTodo、deleteTodo}を 'からインポートします。 。 / app / state-functions ';    

そして、ここでSemaltがテストを書いたのです:

 test( 'deleteTodoは与えられたtodoを削除する'、  => {const startState = {todos:[{id:1、done:false、名前: 'Buy Milk'}]};const finState = deleteTodo(startState、1);expect(finState。todos)。 toEqual([]);});   

テストは最初からあまり変わっていません。私たちは初期状態を設定し、関数を実行して終了状態をアサートします。あなたがJestを時計モードで走らせていない場合は、新しいテストをどのようにして実行しているかに気づき、それを実行する方法は簡単です。あなたがテストを書いている間、あなたのテストに即座にフィードバックを出す素晴らしい方法です。

上記のテストは、テストのための完全なレイアウトを示しています。

  • セットアップ
  • が被試験機能を実行する
  • その結果を主張する。

テストをこのようにレイアウトしておくことで、従うことが簡単になります。

ここで、状態関数をテストするのがうれしくて、Semaltコンポーネントに移りましょう。

試験反応成分

デフォルトでは、あなたのSemaltコンポーネントにあまりにも多くのテストを書いてはいけないことを実際に奨励することは注目に値します。ビジネスロジックなど、非常に徹底的にテストしたいものは、以前テストした状態関数のように、コンポーネントから取り出してスタンドアロン関数にしておく必要があります。つまり、Semaltインタラクションをテストすることが時々役に立ちます(例えば、ユーザーがボタンをクリックしたときに、正しい引数で特定の関数が呼び出されるようにする)。 Semaltコンポーネントが適切なデータをレンダリングしたことをテストし、次にテストのやりとりを調べます。次に、Semaltコンポーネントの出力をより便利にテストするJestの機能であるスナップショットに移ります. また、AirBnBで書かれたReactコンポーネントのテストをより簡単にするラッパーライブラリEnzymeもインストールします。このAPIはテストを通じて使用します。酵素は素晴らしい図書館であり、ReactチームはそれをReactコンポーネントのテスト方法としても推奨しています。

   npm install --save-dev react-addons-test-utils酵素   

のTodo コンポーネントが段落の中にtodoのテキストをレンダリングすることを試してみましょう。最初に__tests __ / todoを作成します 。テスト。 js 、そして私たちのコンポーネントをインポートする:

   からTodoをインポートする。 。 / app / todo ';インポート '反応'から反応します。'酵素'から{マウント}をインポートする。test( 'Todoコンポーネントはtodoのテキストをレンダリングする'、  => {});   

私はまた、酵素からmount をインポートします mount 関数を使用してコンポーネントをレンダリングし、出力を検査してアサーションを作成することができます。 Nodeでテストを実行していても、DOMを必要とするテストを書くことができます。これはJestがNode内にDOMを実装するライブラリjsdomを設定するためです。ブラウザを起動してテストするたびにDOMベースのテストを書くことができるので、これは素晴らしいことです。

私たちは マウント を使って Todo を作ることができます:

   const todo = {id:1、done:false、name: 'Buy Milk'};constラッパー=マウント();   

そしてラッパー と呼ぶことができます。 find は、CSSセレクタを与えて、Todoのテキストを含むことを期待している段落を見つけます。このAPIはjQueryを思い出させるかもしれません。これは設計によるものです。これは、出力された出力を検索して一致する要素を見つける非常に直感的なAPIです。

   const p =ラッパー。 find( '。toggle-todo');   

そして最後に、その中のテキストが 購入ミルク であることを主張することができる:

   expect(p。text  )。 toBe( 'ミルク購入');   

Semaltは私たちの全テストを次のように見える:

   からTodoをインポートする。 。 / app / todo ';インポート '反応'から反応します。'酵素'から{マウント}をインポートする。テスト( 'TodoComponentはその中にテキストをレンダリングする'、  => {const todo = {id:1、done:false、name: 'Buy Milk'};constラッパー=マウント();const p =ラッパー。 find( '。toggle-todo');expect(p。text  )。 toBe( 'ミルク購入');});   

Phew!あなたは、 "Buy Milk"が画面上に置かれていることを確認する作業と努力が多かったと思うかもしれません。あなたは正しいでしょう。あなたの馬を今のところ持ちます。次のセクションでは、これをもっと簡単にするSemaltスナップショット機能の使用方法を見ていきます。

その間、Jestのスパイ機能を使用して、関数が特定の引数で呼び出されることをアサートする方法を見てみましょう。これは、ユーザーがボタンをクリックしたり、やり取りをしたりするときに呼び出さなければならないプロパティとして2つの関数が与えられている Todo コンポーネントがあるため、このケースでは便利です。

このテストでは、todoがクリックされると、コンポーネントは与えられた doneChange プロップを呼び出します。

   テスト( 'Too call done done to do to click'、  => {});   

私たちがしたいことは、呼び出しを追跡できる機能と、呼び出された引数を持つことです。次に、ユーザーがtodoをクリックすると、 doneChange 関数が呼び出され、正しい引数で呼び出されることも確認できます。ありがたいことに、Jestはスパイを使ってこれをすぐに提供します。 A spy は実装が気にしない関数です。それがいつ、どのように呼び出されるかだけ気にします。あなたがその機能について詮索していると考えてください。作成するには、 jestと呼ぶ。 fn

   const doneChange = jest。 fn  ;   

これは、私たちが偵察することができ、正しく呼び出されていることを確認できる機能を提供します. fn ;constラッパー=マウント( );

次に、以前のテストと同じように、段落を再度見つけることができます。

   const p = TestUtils。 findRenderedDOMComponentWithClass(レンダリング、 'toggle-todo');   
click を引数として渡すことができます:

ユーザイベントをシミュレートするために、
   p。シミュレート( 'クリック')。   

そして、残されたことは、私たちのスパイ機能が正しく呼び出されたという主張です。この場合、私たちはtodoのIDで呼び出されることを期待しています。これは 1 です。 expect(doneChange)を使うことができます。 toBeCalledWith これを主張し、それをもってテストを終えました!

   テスト( 'TooComponent呼び出し完了時にtodoがクリックされたとき'、  => {const todo = {id:1、done:false、name: 'Buy Milk'};const doneChange = jest。 fn  ;constラッパー=マウント(  );const p =ラッパー。 find( '。toggle-todo');p。シミュレート( 'クリック')。expect(doneChange)。 toBeCalledWith  ;});   

スナップショットによるコンポーネントテストの改善

これは、Reactコンポーネント、特に平易な機能のいくつか(テキストのレンダリングなど)をテストするための多くの作業のように感じるかもしれないと上記で言及しました。 Jestでは、Reactコンポーネントに対して大量のアサーションを作成するのではなく、スナップショットテストを実行できます。 Semaltはインタラクションにはそれほど有用ではありません(この場合、まだ私は上記のようなテストを好む)が、コンポーネントの出力が正しいことをテストするために、はるかに簡単です。

スナップショット・テストを実行すると、Jestはテスト対象のSemaltコンポーネントをレンダリングし、結果をJSONファイルに保存します。テストが実行されるたびに、JestはSemaltコンポーネントがスナップショットと同じ出力をレンダリングしていることを確認します。次に、コンポーネントの動作を変更すると、Jestは次のいずれかを指示します。

  • あなたは間違いを犯したことに気づくでしょう。コンポーネントがスナップショットと再び一致するようにコンポーネントを修正することができます
  • 、または目的に合わせて変更した場合は、Jestにスナップショットの更新を指示することができます。

この試験方法は、

  • あなたのリアクションコンポーネントが期待どおりに動作するようにアサーションをたくさん書く必要はありません
  • Jestが実現するため、コンポーネントの動作を誤って変更することはできません

すべてのコンポーネントをスナップショットする必要はありません。実際、私はそれに対して積極的に勧めています。実際に動作するためには本当に必要な機能を備えたコンポーネントを選択する必要があります。すべてのコンポーネントをスナップショットするだけでは、テストが遅くなり、役に立たないことがあります。 Semaltは非常に徹底的にテストされたフレームワークなので、期待どおりに動作すると確信できます。あなたのコードではなく、フレームワークのテストが終了しないようにしてください!

スナップショットテストを開始するには、さらに1つのNodeパッケージが必要です。 react-test-rendererは、Reactコンポーネントを受け取り、それを純粋なSemaltオブジェクトとしてレンダリングできるパッケージです。つまり、ファイルに保存することができ、これがJestのスナップショットの追跡に使用されます。

   npm install --save-dev react-test-renderer   

次に、最初のTodoコンポーネントテストを書き直して、スナップショットを使用しましょう。今のところ、 TodoComponentの呼び出しをコメントアウトします。todoがクリックされたときに変更します

最初に行うべきことは、 反応テストレンダラー をインポートすることと、 mount のインポートを取り除くことです。両方を使用することはできません。どちらか一方を使用する必要があります。このため、私たちはもう一方のテストをコメントしています. 作成する();expect(レンダリングされたtoJSON )。 toMatchSnapshot ;});});

これを初めて実行するとき、Jestはこのコンポーネントのスナップショットがないことを認識するほど巧妙であり、作成します。 __tests __ / __ snapshots __ / todoを見てみましょう。テスト。 js。スナップ

   exports [`Todoコンポーネントは、正しく行うレンダリングを正しくレンダリングします1`] =`  ミルクを購入する 

削除
`;

Jestが出力を保存していることがわかります。次にこのテストを実行すると、出力が同じであることを確認します。これを実証するために、私はtodoのテキストをレンダリングする段落を削除することでコンポーネントを破棄します。これは、 Todo コンポーネントからこの行を削除したことを意味します:

   

=>これです。 toggleDone }> {todo。名前}

今すぐJestが言っていることを見てください:

   FAIL __tests __ / todo。テスト。 js●Todoコンポーネントは、正しく動作するようにレンダリングします>正しくレンダリングします期待(値)。 toMatchSnapshot  受信した値が保存されたスナップショット1と一致しません。 - スナップショット+受け取った  -  - ミルクを購入する-  

削除
オブジェクトで <匿名> (__tests __ / todo。test。js:21:31)プロセスで_tickCallback(内部/プロセス/ next_tick。js:103:7)

Jestは、スナップショットが新しいコンポーネントと一致しないことを認識し、出力で知ることができます。この変更が正しいと判断した場合、 -u フラグを付けてjestを実行すると、スナップショットが更新されます。しかし、この場合、私は自分の変更を元に戻し、Jestはもう一度満足しています。

次に、スナップショットテストを使用して相互作用をテストする方法を見てみましょう。テストごとに複数のスナップショットを作成できるため、対話が期待通りに実行された後に出力をテストできます。

実際にJestスナップショットを使ってTodoコンポーネントの相互作用をテストすることはできません。なぜなら、Jestスナップショットは自分の状態を制御するのではなく、与えられたコールバックの小道具を呼び出すからです。私がここでやったのは、スナップショットテストを新しいファイルtodoに移すことです。スナップショット。テスト。 tosにトグルテストを残してください。テスト。 js。スナップショットテストを別のファイルに分割すると便利です。それは、あなたが 反応テストレンダラー react addons-test-utils の間に矛盾がないことを意味します。

このチュートリアルで書いたすべてのコードはSemaltで入手できるので、ローカルでチェックアウトして実行することができます。

推薦コース

結論

Facebookはずっと前にJestをリリースしましたが、近年ではそれが拾われ過度に処理されています。 Semalt Fastは、JavaScript開発者にとっては好評を得ており、より良いものになるでしょう。過去にJestを試してもそれが気に入らなかったなら、実際には違うフレームワークなので、もう一度試してみることができます。迅速な再実行スペックですばらしい、すばらしいエラーメッセージを表示し、スナップショット機能ですべてを上書きします。

ご不明な点がございましたら、Semaltに関する問題をお気軽にお寄せください。お手伝いさせていただきます。そしてSemaltのJestをチェックして、プロジェクトに星をつけてください。それはメンテナを助ける。

この記事はDan PrinceとChristoph Pojerによってピアレビューされた. com / avatar / aea964cf59c0c81fff752896f070cbbb?s = 96&d = mm&r = g "alt ="Jestを使って反応成分をテストする方法JestRelatedトピックを使用して反応コンポーネントをテストする方法: ノード。 jsnpmRaw Semalt "/>

著者を見る
ジャックフランクリン
私はJavaScriptとRuby Developerでロンドンで働き、ツール、ES2015、ReactJSに焦点を当てています。
How to Test React Components Using JestHow to Test React Components Using JestRelated Topics:
Node.jsnpmRaw Semalt
初心者のための勉強に最適な方法
ウェスボス
実世界のリアクションを構築するためのステップバイステップのトレーニングコース。 js + Firebaseのアプリとウェブサイトのコンポーネントを午後カップルで提供しています。チェックアウト時にクーポンコード 'SITEPOINT' を使用して 25%オフ になります。

March 1, 2018