らくだ🐫にもできるRailsチュートリアル|3.3

3.3 テストから始める

テストのタイミングのガイドライン

  • アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる (=簡単に書ける) のであれば、「先に」書く
  • 動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を「後で」書く
  • セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合、テストを「先に」書く
  • バグを見つけたら、そのバグを再現するテストを「先に」書き、回帰バグを防ぐ体制を整えてから修正に取りかかる
  • すぐにまた変更しそうなコード (HTML構造の細部など) に対するテストは「後で」書く
  • リファクタリングするときは「先に」テストを書く。特に、エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする

リファクタリングとは何ぞ

プログラムの動きは変えずにソースを整理して見やすくする事的な感じ

3.6.1 minitest reporters

テストを実行する前にちょっと先走って
3.6.1に書いてあるこちらの設定をしておきます
テスト結果に色が付くので見やすくなります

2019.05.24
後から気づいたんですがこの内容ってmasterブランチでやっておく様に本文に書いてあるんですね。
なんでだろうって考えたんですが
例えば何かしら理由があってstatic-pagesブランチの内容を丸っと削除してしまうとこの更新も消えてしまうからとか。
(マージ後だとしても、マージを取り消して→ブランチを丸っとなかったことにすると消えますよね)
と、言う訳でブランチを切る前にこの設定をやるようにらくだ🐫にもできるRailsチュートリアル|3.2に移動します。

3.3.1 最初のテスト

rails generate controller StaticPages home helpdeで生成されたテストコード

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  #homeページのテスト
  test "should get home" do
    #/static_pages/homeのURLに getのリクエスト
    get static_pages_home_url
    #レスポンスは成功 に なるはず
    assert_response :success
  end

  #helpページのテスト
  test "should get help" do
    #/static_pages/helpのURLに getのリクエスト
    get static_pages_help_url
    #レスポンスは成功 に なるはず
    assert_response :success
  end

end

ではテストを実行してみます

(static-pages) $ rails t
Running via Spring preloader in process 15469
/home/ec2-user/environment/sample_app/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /home/ec2-user/environment/sample_app/config/application.rb to limit the frameworks that will be loaded.
Started with run options --seed 44061

  2/2: [======================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.30129s
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
#エラーは無かったけど何やら怪しい表示↓
Traceback (most recent call last):
        33: from -e:1:in `
'
・
・
・
         1: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/tmux.rb:69:in `_check_available'
/home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/tmux/client.rb:12:in `version': undefined method `[]' for nil:NilClass (NoMethodError)
#この辺が怪しいですね

どうやらエラーの模様です
下記サイトを参照に修正します

#管理者権限でtmuxをインストール的なコマンド
$ sudo yum install -y tmux
・
・
・
#インストールが終了したら再度test
$ rails t
・
・
・
  2/2: [======================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.30332s
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
#テストも通るしエラーも出なくなりました

3.3.2 Red

「失敗するテストを書く→コードを書いて成功させる→必要があればリファクタリング」
この流れに沿ってAboutページを作っていきます

まずはテスト
homeやhelpと同じ内容でアクセス先をaboutに変更

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do
    get static_pages_help_url
    assert_response :success
  end

  test "should get about" do
    #/static_pages/aboutのURLに getのリクエスト
    get static_pages_about_url
    #レスポンスは成功 に なるはず
    assert_response :success
  end
end

aboutページからレスポンスは成功しないためtestはRED(エラー)
と言うより「/static_pages/aboutへのURLが見つからない(定義されていない)ため、エラー判定が途中でストップしちゃってます」→GREENにならない(便宜上RED)の方が近いっぽい

$ rails t
・
・
・
ERROR["test_should_get_about", StaticPagesControllerTest, 0.14728970400000208]
 test_should_get_about#StaticPagesControllerTest (0.15s)
#/static_pages/aboutへのURLが見つからないよ的なエラーメッセージ
NameError:         NameError: undefined local variable or method `static_pages_about_url' for #

#上記のエラーがどこで引っかかっているのか教えてくれているメッセージ
            test/controllers/static_pages_controller_test.rb:15:in `block in '

  3/3: [===================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.43253s
3 tests, 2 assertions, 0 failures, 1 errors, 0 skips

3.3.3 Green

ルートを追加

Rails.application.routes.draw do
  get  'static_pages/home'
  get  'static_pages/help'
  get  'static_pages/about'
  root 'application#hello'
end

ルーティングを指定したことにより
自動的に「static_pages_about_url」が使えるようになる

ヘルパーとは何ぞ

滅茶苦茶ざっくりですが「便利な部品・機能」
例えば上の「static_pages_about_url」は「/static_pages/aboutというURL」を表している

再テストとアクションの追加

$ rails t
・
・
・
AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController
#static_pagesコントローラにaboutアクションがないよ的なエラーメッセージ
・
・
・
class StaticPagesController < ApplicationController
  def home
  end

  def help
  end
  
  #aboutアクションを追加
  def about
  end
  
end

再テストとビューの追加

$ rails t
・
・
・
#aboutのテンプレート(view)がないよ的なエラーメッセージ
ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant.
・
・
・
#app/views/static_pagesにabout.html.erbが作成される
$ touch app/views/static_pages/about.html.erb
#ファイルツリーに表示されない場合、更新すると出てくる

本文に従ってファイルを編集→テストがGREEN

3.3.4 Refactor

本文ママ

まとめとか感想

ちょこちょこ本文にないエラーに遭遇するし
1週目には無かったエラーにもであったりもするけど
エラー文とかで調べれば解決策が出てくるのでありがたいことです

2019.05.24
3.2.2のテストREDの解釈に解釈と言うか理解について
ツイッターで教えてもらったことがあったので追加・修正しました
独学だとどうしても限界があったりするので
新しい気付きを貰えて、とてもありがたく思っています。感謝。

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです