Rspec - osamaster2cn/muscle_museum GitHub Wiki

コマンド

# テストの実行
bundle exec rspec

# モデルspecの生成
bin/rails g rspec:model モデル名

# コントローラspecの生成
bin/rails g rspec:controller コントローラ名

# リクエストspecの生成
bin/rails g rspec:request コントローラ名

# フィーチャーspecの生成(古)
bin/rails g rspec:feature フィーチャー名

# factoriesの生成
bin/rails g factory_bot:model モデル名

構文

# 基本
# RSpec.describe・・・テストのグループ化
# it...do end・・・テストをexampleという単位にまとめる

RSpec.describe '四則演算' do
  it '1 + 1 は 2 になること' do
    expect(1 + 1).to eq 2
  end
end

FactoryBot

# FactoryBot.create => テスト用データベースにオブジェクトを永続化(DBに保存)
FactoryBot.create(:user, email: "[email protected]")

# 画像データはcreateで作成してDBに保存しないと反映されない。
FactoryBot.create(:user, profile_photo: profile_photo) 

# FactoryBot.build => テスト用オブジェクトをメモリ内に保存(DBに保存されない)
user = FactoryBot.build(:user, email: "[email protected]")

Capybara

# 全種類のHTML要素を扱う
scenario "works with all kinds of HTML elements" do

  user = FactoryBot.create(:user)

  # ページを開く
  visit "/fake/page"
  # リンクまたはボタンのラベルをクリックする
  click_on "A link or button label"
  # チェックボックスのラベルをチェックする
  check "A checkbox label"
  # チェックボックスのラベルのチェックを外す
  uncheck "A checkbox label"
  # ラジオボタンのラベルを選択する
  choose "A radio button label"
  # セレクトメニューからオプションを選択する
  select "An option", from: "A select menu"
  # ファイルアップロードのラベルでファイルを添付する
  attach_file "A file upload label", "/some/file/in/my/test/suite.gif"

  # リンクボタンをクリックする
  click_link "ログインする"

  # フォームに入力する
  fill_in "メールアドレス", with: user.email
 fill_in "パスワード", with: user.password
 
  # ボタンをクリックして、入力値を処理 
  click_button "ログイン"

  # 指定したコンテンツ内容に一致する文字列が存在することを検証する
  expect(page).to have_content "ログインに成功しました"
  # 指定したCSSに一致する要素が存在することを検証する
  expect(page).to have_css "h#subheading"
  # 指定したセレクタに一致する要素が存在することを検証する
  expect(page).to have_selector "ul li"
  # 現在のパスが指定されたパスであることを検証する
  expect(page).to have_current_path "/projects/new"
end

設定

# 必要なGem
group :development, :test do
  # Rspec
  gem 'rspec-rails'
  # テストの起動を高速化
  gem 'spring-commands-rspec'
  # テストデータの作成
  gem 'factory_bot_rails'
  # テストデータの削除
  gem 'database_cleaner-active_record'
  # ブラウザ操作。システムspecで使用。
  gem 'capybara'
  # テスト失敗時に生成するHTMLを自動で開く。システムspecで使用。
  # ※ テストコードに save_and_open_page を埋め込む必要有
  gem 'launchy'
  # テストを実行するブラウザ
  gem 'webdrivers
  # 簡素に記載できるマッチャを提供
  gem 'shoulda-matchers'
  # HTTP通信の記録、管理、テストの効率化
  gem 'vcr'
  # HTTPをスタブ化する
  gem 'webmock'
end

# .rspecファイル
--require spec_helper
--format documentation

参考リンク

RspecでJavascriptのテストを実施する時

初心者大歓迎!RSpec 3でドラッグアンドドロップ機能をテストする方法(スクリーンキャスト付き)

メモ

  • テストコードを書く順番

    1. describe(テスト内容の主題、大枠)、context(テスト内容の状態、状況)でテストケースを整理
    2. it(テスト実行部分で)でテストコードを記載
    3. before(前提条件)、let(共通変数)、shared_exampleなどで共通化、DRYに。
  • DRYを検討する時

    • before → let
    • shared_context → DRYになりすぎないように検討
    • spec/supportにログインなどの共通処理のファイルを作成する
    • aggregate_failuresで似たようなexpectは集約
aggregate_failures do
 expect(response).to be_successful
 expect(response).to have_http_status "200"
end

コントローラテスト

  • 手順
  1. コントローラ各アクションの認証マトリクスを作成
  2. コントローラテストファイルをジェネレート
  3. rails_helper.rbにDeviseのテストヘルパー設定を追加
  4. FactoryBotでテストデータ作成
  5. 認証マトリクスをベースに各アクションのテストコードを記載

必要なテストは以下3つ?

  1. モデルテスト(Model Spec)

    • 確認観点
      • データバリデーションは想定どおりか
      • メソッドの挙動は想定どおりか
  2. 結合テスト(Request Spec)

    • 確認観点
      • Webリクエストが成功したか
      • 正しいページにリダイレクトされたか
      • ユーザー認証が成功したか
      • ビューに表示されたメッセージは適切か
  3. システムテスト(System Spec)

    • 確認観点
      • システムの重要度の高いユースケース操作は想定どおりか