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

3.3 テストから始める

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

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

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

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

3.6.1 minitest reporters

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

テストを実行する前にちょっと先走って
3.6.1に書いてあるこちらの設定をしておきます

/sample_app/test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!
#上記の2行を追加します

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

テスト結果に色が付くので見やすくなります

3.3.1 最初のテスト

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

/sample_app/test/controllers/static_pages_controller_test.rb
require 'test_helper'

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

  test "should get help" do
  #helpページのテスト
    get static_pages_help_url
    #/static_pages/helpのURLに getのリクエスト
    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) #この辺が怪しいですね

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

ターミナル
$ sudo yum install -y tmux
#管理者権限で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に変更

/sample_app/test/controllers/static_pages_controller_test.rb
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
    get static_pages_about_url
    #/static_pages/aboutのURLに getのリクエスト
    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)
NameError:         NameError: undefined local variable or method `static_pages_about_url' for #
#/static_pages/aboutへのURLが見つからないよ的なエラーメッセージ

            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

ルートを追加

/sample_app/config/routes.rb
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アクションがないよ的なエラーメッセージ
・
・
・
/sample_app/app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
  def home
  end

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

再テストとビューの追加

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

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

3.3.4 Refactor

本文ママ

まとめとか感想

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

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

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

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

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