Open6

Railsチュートリアルメモ

アライ リョータアライ リョータ

テストを行う目的

テストのメリット
  • 機能停止に陥るような回帰バグ(Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること)を防止できる。
  • コードを安全にリファクタリング(機能を変更せずにコードを改善)できる。
  • テストコードは、アプリケーションコードから見ればクライアントとして動作するため、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ。
アライ リョータアライ リョータ

「TDD」か「一括テスト」か

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

RSpec・FactoryBot

セットアップ
  • Gemfileにgemを記述
Gemfile
group :development, :test do
  ・
  ・
  gem 'factory_bot_rails'
  gem 'rspec-rails'
end
  • インストール
ターミナル
$ bundle

Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Fetching rspec-support 3.13.1
Fetching factory_bot 6.4.6
Installing rspec-support 3.13.1
Installing factory_bot 6.4.6
Fetching rspec-expectations 3.13.0
Fetching rspec-mocks 3.13.1
Fetching rspec-core 3.13.0
Fetching factory_bot_rails 6.4.3
Installing rspec-expectations 3.13.0
Installing rspec-mocks 3.13.1
Installing factory_bot_rails 6.4.3
Installing rspec-core 3.13.0
Fetching rspec-rails 6.1.2
Installing rspec-rails 6.1.2
Bundle complete! 25 Gemfile dependencies, 126 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
1 installed gem you directly depend on is looking for funding.
  Run `bundle fund` for details
  • RSpecの関連ファイルの生成
ターミナル
$ bin/rails g rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
  • 出力をドキュメント形式に変更・色をつける設定を追加 ※任意
.rspec
--format documentation
  • 動作確認
ターミナル
$ bundle exec rspec
No examples found.

Finished in 0.00019 seconds (files took 0.06596 seconds to load)
0 examples, 0 failures
  • ESpec導入によりminitest関連のファイルは不要になるので削除 ※必須ではない
ターミナル
$ rm -rf test
アライ リョータアライ リョータ

RSpecコマンド

RSpecコマンド例
# すべてのテストを実行する
$ bundle exec rspec

# 特定の種類のテストを実行する
$ bundle exec rspec spec/requests
$ bundle exec rspec spec/system

# 特定のファイルのテストを実行する
$ bundle exec rspec spec/requests/<RSpecファイル名>

# 特定のファイルの特定の行からテストを実行する
$ bundle exec rspec spec/requests/<RSpecファイル名:行数>
RSpecのカバレッジ計測
アライ リョータアライ リョータ

パーシャルファイルの管理のついての考え方

(考え方の一例として)

  • 全ページ共通のパーシャル:layoutsディレクトリ
  • 複数のビューで共有するパーシャル:sharedディレクトリ
layoutsディレクトリで管理するファイル

  • ヘッダー
  • フッター
  • ナビゲーションバー
sharedディレクトリで管理するファイル

  • フォームのバリデーションエラー表示
  • 検索バー
  • サイドバー
アライ リョータアライ リョータ

名前付きルーティング

基礎的なルーティングの記述
routes.rb
Rails.application.routes.draw do
  root 'static_pages#home' # rootメソッドを使用して、/でアクセスできるようにしている
  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'
  get 'static_pages/contact'
end
root メソッドを使用することで名前付きルーティングを参照できる

ルートURLを定義することで、メソッドを通じてURLを参照できるようになる。

👉 Railsでは、基本的には_pathを使い、リダイレクトの場合のみ_urlを使う。
-> HTTPの標準として、リダイレクトのときに完全なURLが要求されるため。
※ただし、ほとんどのブラウザでは、どちらの方法でも動作する

root以外の名前付きルーティングの設定
構文
get '/URL', to: 'コントローラ名#アクション名'

rootと同様に、名前付きルーティングが使用できる。

名前付きルーティングへの修正例
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to: 'static_pages#help'
  get '/about', to: 'static_pages#about'
  get '/contact', to: 'static_pages#contact'
end
名前付きルーティングを利用したlink_toの設定
名前付きルーティングのリンク設定例
<%= link_to "About", about_path %>