Controller testでは、名前の通りコントローラのテストを行います。これは、機能テストと呼ばれるものです。
このテストでは、リクエスト・レスポンスが上手くいくかやレコードの増減、リダイレクトやビューの中身をテストします。
Controller testでは、名前の通りコントローラのテストを行います。これは、機能テストと呼ばれるものです。このテストでは、リクエスト・レスポンスが上手くいくかやレコードの増減、リダイレクトやビューの中身をテストします。
リクエスト・レスポンスとは、ユーザーからページの表示(GET)やデータの作成(POST)などのリクエストが送られた際に、レスポンス(指定されたページの表示など)が送信されるという意味です。
では、コントローラテストを行っていきましょう。まず、コントローラを作成します。以下を参考に作成してください。
コントローラの為のテストファイルは、コントローラ作成時点で一緒に作られています。また、このファイルはコントローラごとに作成されるものです。では、上記ディレクトリから「articles_controller.rb」を開いてください。
初期の状態は上記のような感じです。ここに、テストを追加します。追加するテストは、リクエスト・レスポンスのテストです。以下を参考にルーティングを確認してください。
これで、各アクションのリクエストの種類が分かったと思います。では、各アクションできちんとリクエストやレスポンスが行えるかテストしていきます。「articles_controller.rb」を開いて、以下を参考にテストを追加してください。
これは、各アクションにリクエスト(GET)を送り、正しくレスポンスが返って来るかをテストしています。まず、ブロック内の1行目でGETリクエストを送るよう記述しています。ここでのリクエスト内容は、指定ページのデータの要求です。
次に、「assert_response」というアサ―ションを使用しています。これは、期待するレスポンスの種類を指定する為のものです。
今回は、「success」という種類のレスポンスが返って来れば成功となります。successとは、正常にリクエストを受け付ける事が出来たという意味です。では、テストを実行してみます。
赤字ですので、テストは失敗です。しかし、今までの表示とは少し違った部分があります。これまでは、テストに失敗すると「F」と表示されていましたね。今回は「E」です。これは、単純なテストの失敗とエラーを伴うテストの失敗の違いです。
今回は「ActionNotFound...」というメッセージから分かるように、コントローラにアクションがない為、アクセスしようとするとエラーが出てしまうのです。
他にビューの作成などもしていないので、このままではエラーが出てしまいます。ですので、コントローラにアクションを追加して、ビューも作成しましょう。
次に、以下ディレクトリに、以下ビューを作成します。そして、もう1度テストを実行します。エラーの解消+テストの成功が確認できるはずです。
では次に「show・edit」アクション部分のテストを追加します。この2つのアクションのテストは、基本的には先ほどと同じです。
しかし「rails routes」コマンド実行結果からも分かるように、リクエストに記事の「id」が含まれます。この場合は、テストファイル内でもそのように記述する必要があります。では、テストの追加の前に、コントローラにアクションを追加し、ビューを作成しておきましょう。
テスト追加の前に、もう一つ準備を行います。リクエストに記事の「id」が含まれている必要があるという事は、記事がない状態だとテストも行えません。ですので「setup」メソッドで、サンプルの記事を準備します。
この時、フィクスチャを使用すると簡単です。フィクスチャはモデルの作成時に、自動で作成されています。上記ディレクトリから、開いて確認してみてください。今回、このサンプルレコードの「one」を使用します。
使用方法はいくつかありますが、基本的な使い方は上記のとおりです。モデル名(:サンプルレコード名)という形で呼び出します。これで、記事を用意する事が出来ました。では、以下を参考にテストの追加を行いましょう。これで、テストは成功するはずです。
次に、update アクション部分のテストを追加します。その為に、コントローラにアクションを追加します。以下を参考に、アクションを追加してください。
記事の更新を行い、更新に成功したら「show」ページへリダイレクトを行うという内容です。では、以下を参考にテストを追加しましょう。
まず「patch」というのは、データの一部を更新する為のリクエストの種類です。そして、次に続くURL部分ですが「show」ページのURLと同じになっています。
これは、showなのかupdateなのかを識別する為の情報はURLではなく、リクエストの種類であるためです。また「id」も含まれていますね。
次に「params」という部分ですが、ここは更新内容のデータの部分です。まず、サーバーへのレコードの受け渡しには、パラメータが使用されます。パラメータに、値が入ってサーバーに渡されるイメージです。
ですので、記事(レコード)の更新や作成などが含まれるテストを行う場合には、このパラメータ部分の記述が必要になります。また、無関係の値などが送信されないように、モデル名やカラム名なども、値と合わせて記述する必要があります。
そして最後に、リダイレクトのテストを追加します。「assert_redirect_to」というアサ―ションは、リダイレクトがきちんと行われるかをテストする為のものです。
リダイレクト先は、コントローラに記述したように「show」ページにしています。では、テストを実行してみます。
では最後に「create / destroy」アクションのテストを追加してみます。今回は先ほどと同じく、パラメータを使用したレコードの作成・削除のテストとリダイレクトのテストに加え、レコードの増減についてのテストを行います。
これは、レコードの作成・削除を行うと、データベース内のレコードの総数に変動があるはずだという内容のテストです。では、最初にコントローラにアクションを追加します。
記事の作成を行い、保存できたら「show」ページへリダイレクトします。保存に失敗すると「new」ページへリダイレクトするという内容です。では、テストを追加しましょう。
最初に、assert_differenceというアサーションが使われています。これは、ある処理が実行される前と後で、引数で指定した値が増減しているはずというテストしたい時に使うものです。今回の場合の、引数の値はArticleレコードです。
そして、このアサーションを使用する場合はブロックを使います。このブロック内に、ある処理にあたるものを記述します。今回は、記事の投稿という処理を記述しています。
では、処理の部分を詳しくみてみます。まず、post articles_url という部分です。post というリクエストは、データを作成するというリクエストです。
最後に、assert_redirect_to 〜 .last) の部分です。リダイレクトがうまくいけば、showページが表示されます。どの記事のshowページが表示されるかは引数部分で指定しています。きちんと投稿出来ていれば、Article.lastは投稿した記事になります。
ですので、Article.lastとしています。では、テストを実行してみましょう。
テストは成功となります。では最後に、destroyアクションです。まず、コントローラにアクションを追加します。
リダイレクト先は「index」ページです。では、テストを追加してみます。
先ほどと同じアサーションが使われています。引数の部分では、Article.count マイナス 1と指定しています。これは、レコードが削除されれば、データベース内のレコードの総数も1減るはずだという事です。
ブロック内では、レコード削除の処理を行うと指定しています。最後に、削除後のリダイレクトのテストを記述しています。では、テストを実行してみましょう。
テストは成功です。これで、全てのアクションのテストを追加出来ました。では、次にCommentコントローラの作成を行いましょう。
Commentコントローラ用のテストファイルも生成されています。では、コントローラに、コメントと記事を紐づけるための記述を追加します。
更に、コメントを投稿する為のフォームと、コメントを表示する為のViewを追加します。まず、View / articles ディレクトリに「_form.html.erb」を作成します。そして、以下を参考にコードを追加してください。
次に、View / comments ディレクトリに「 _comment.html.erb」を作成します。そして、以下を参考にコードを追加してください。
ここまでで作成したViewは、パーシャルと呼ばれるものです。このパーシャルを、Articleの「show.html.erb」内で呼び出すよう記述します。
では、テストを書いていきましょう。基本的な内容は、Articleと同じですが、コメントの存在は、必ず記事が存在していることが前提としてあります。その部分のみ、異なりますので、そこに注意しながら以下を参考に追加してください。
最後に、テストを実行してみます。全てのテストが成功しているはずです。
コントローラの基本的なテストは、このような感じで行われます。こういったテストを、機能の追加などの時点で加筆していけば、アプリの仕様も明確になり、スムーズに制作を行なっていけるでしょう。
コントローラテストは、機能テストとも呼ばれます。リクエスト・レスポンスが上手くいくかやレコードの増減、リダイレクトやビューの中身をテストしましょう。
コントローラの為のテストファイルは、コントローラ作成時点で一緒に作られます。テスト実行結果内の「E」は、エラーを伴うテストの失敗を意味します。また、サンプルレコードは、モデル名(:サンプルレコード名)という形で呼び出します。
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。