しおブログ言うてますけど

技術ブログ言うてますけど技術以外のことも発信すると思われ。RubyとかRuby on Railsとか生き方とかジャンルにこだわらず自分の好きなように。初心者なのでお手柔らかに。

RSpec 〜ログイン処理をmoduleにまとめる

こんにちは。塩濵です。
RSpecを使ってテストを書いている時、ログインの処理を書くことがよくあります。
毎回書くのは大変なので今回はログイン処理のテストをmoduleにまとめることで、毎回書かずにわかりやすいコードにするということについてまとめていきます。

前提

前提として、RSpec、capybara、factory_bot_railsのGemが追加してあり、 これらのGemが正しく使えること。

RSpecの基本形

RSpecについて詳しくはここではまとめませんが、基本的な記法だけ、まとめておきます。

describe [ 仕様を記述する対象(テスト対象) ], type: [ Specの種類 ]  do

  context [ ある状態・状態 ] do
    before do
      [事前準備]
    end

    it [ 仕様の内容(期待の概要) ] do
      [期待する動作]
    end
  end

end

RSpecの基本的な形は上記の様になります。
itに達成するまでにdescribeやcontextを何個もネストすることもでき、内部のcontext、describe、itを並べて複数記述することもできます。
ネストや複数記述したSystem Specのコードの基本形も書いておきます。

describe '〜機能', type: :system do

  describe '登録' do

    context '〇〇の場合' do
      before do
        # (context内を確認するのに必要な)事前準備
      end

      it '△△する' do
        # 期待する動作
      end
    end

    context 'XXの場合' do
      before do
        # (context内を確認するのに必要な)事前準備
      end

      it '○○する' do
        # 期待する動作
      end
    end
  end

  discribe '削除' do
    # 略
  end
end

たくさん用語が出てきますが、大きく分けて2つのタイプに分ける事ができます。
●テストケースを整理・分類する => describe, context
●テストコードを実行する => before, it

このようにdescribe, contextは整理、分類するために使われ、before, itはテストコードを実行するために記述されます。

UserFactoryの作成

ログイン処理をmoduleにまとめる前にUserFactoryを作成することによってテスト実行時に、ログインさせるユーザーを作成します。
ここではログインページに遷移し、EmailPasswordを入力して、ログインボタンを押すと、ログインが完了するといった処理の流れにしていきたいと思います。

FactoryBot.define do
  factory :user do
    sequence(:email) { |n| "example#{n}@example.com" }
    password { 'password' }
    password_confirmation { 'password' }
  end
end

UserFactoryの作成が完了しました。
sequenceは同一ではない適当な値が代入されます。
この場合、example1@example.comexample2@example.comexample3@example.comというふうになります。

ログイン処理のmoduleを作成

supportディレクトリを作成し、supportディレクトリ内にlogin_module.rbファイルを作成します。
login_module.rbファイルにログインの処理を書いていきます。

module LoginModule
 def login(user)
   visit new_user_session_path
   fill_in 'Email', with: user.email
   fill_in 'Password', with: user.password
   click_button 'ログイン'
   expect(current_path).to eq root_path
 end
end

moduleが設定できたらこのmoduleを読み込む設定をrails_helper.rbに記載します。

# rails_helper.rb

RSpec.configure do |config|
  config.include LoginModule
end

こうすることでSystem Specでログインをまとめたmoduleを使えることができます。

まとめ

今回はログインの処理をmoduleにまとめることによってログインの処理を毎回書かずにコード量を減らせるというメリットがあることについてまとめてみました。
RSpecでテストを書くことにはまだまだ理解が追いついていないので、キャッチアップとアウトプットを繰り返して、身に付けれるように努力していきたいと思いました。