search
LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

SystemSpec導入と書き方

はじめに

これまでに引き続き、現場で使える Ruby on Rails 5速習実践ガイドのアウトプットを投稿します!
今回はrspecについてです!
タスク管理アプリケーションを例に進めていきます。

目次

  1. Rspecの準備
  2. Specの書き方
  3. FactoryBotでテストデータを作成
  4. テストを書く
  5. 参考文献

Rspecの準備

・gemをインストール
Gemfileの
group :development, :test doのブロックに以下を追記します。

gem 'rspec-rails', '~> 3.7'

記述後bundle installでgemをインストールします。完了したら、以下のコマンドを実行し、RSpecに必要なディレクトリや設定ファイルを作成します。

rails g spec:install

・testディレクトリ削除
rails newでアプリケーションを立ち上げた時に自動で作成されるtestディレクトリを削除します。なぜなら、Rspecのファイルは、specディレクトリの中に作成するからです。

rm -r ./test

・Capybaraを使うためにspec_helper.rbを編集
Capybaraはrails newをした際にインストールされているため、機能の読み込み実行するドライバの設定を記述します。

spec/spec_helper.rb
require 'capybara/spec'
config.before(:each, type: :system) do
  driven_by :selenium_chrome_headless
end

・FactoryBotのインストール

Gemfileの
group :development, :test doのブロックに以下を追記します。

gem 'factory_bot_rails', '~> 4.11'

Specの書き方

ここでは、タスク管理アプリケーションの一覧表示に関するテストを例にします。

tasks_spec.rb
describe '一覧表示機能' do
  context 'Aさんがログインしているとき' do
    before do
      # テスト条件を満たすよう処理を記述する
    end
    it 'Aさんの投稿だけが表示される' do
      # 期待する動作を記述する
    end
  end
end

上記の例では条件が一つですが、複数ある場合はcontextをネストすることもできます。

FactoryBotでテストデータを作成

spec/factories/users.rbを作成し、Userモデルのデータを記述します。

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { 'テストユーザー' }
    email { 'test@example.com' }
    password { 'password' }
  end
end

factory :userの記述で、railsがUserモデルのテストデータだなと、解釈してくれます。もし、違う名前をつけたいときは、以下のようにclassを明記します。

factory :test_user, class: User do

次にいま作成したユーザーに紐づく投稿データを作成します。先程と同様に、spec/factories/tasks.rbを作成します。

spec/factories/tasks.rb
FactoryBot.define do
  factory :task do
    name { 'テストを作成する' }
    description { '必要なものをインストールし、作成する。' }
    user
  end
end

上記のuserは、先ほど作成した:userのデータに紐づくものと定義しています。こちらも、モデル名と違うテストデータを紐付けるときはuserの箇所を以下のように書きます。

association :user, factory: :admin_user

テストを書く

まずは、日本語で枠組みを作成していきます。

spec/system/tasks_spec.rb
require 'rails_helper'
describe '一覧表示機能' do
  before do
    # ユーザーAを作成する
    # ユーザーAのタスクを作成する
  end
  context 'ユーザーAがログインしているとき' do
    before do
      # ユーザーAでログイン
      # ログイン画面に遷移
      # メールアドレスを入力
      # パスワードを入力
      # ログインボタンを押す
    end
    it 'ユーザーAが作成したタスクが表示される'
      # 作成されたタスクが表示されている
    end
  end
end

テストの枠組みができたら、実際にテストコードを書いていきます!

spec/system/tasks_spec.rb
require 'rails_helper'
describe '一覧表示機能' do
  before do
    # ユーザーAを作成する
    user_a = FactoryBot.create(:user)
    # ユーザーAのタスクを作成する
    FactoryBot.create(:task, name: "最初のタスク", user: user_a)
  end
  context 'ユーザーAがログインしているとき' do
    before do
      # ユーザーAでログイン
      # ログイン画面に遷移(ログイン画面のpathにvisit)
      visit login_path
      # メールアドレスを入力(labelの名称を指定します)
      fill_in 'メールアドレス', with: 'a@example.com'
      # パスワードを入力(labelの名称を指定します)
      fill_in 'パスワード', with: 'password'
      # ログインボタンを押す
      click_botton 'ログインボタン'
    end
    it 'ユーザーAが作成したタスクが表示される'
      # 作成されたタスクが表示されている
      expect(page).to have_content '最初のタスク'
    end
  end
end

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1