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を参照できるようになる。
- root_path -> '/' # ルートURL以下の文字列
- root_url -> 'https://www.xxxxxx.com/' # 完全な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 %>