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を作成することによってテスト実行時に、ログインさせるユーザーを作成します。
ここではログインページに遷移し、Email
とPassword
を入力して、ログインボタンを押すと、ログインが完了するといった処理の流れにしていきたいと思います。
FactoryBot.define do factory :user do sequence(:email) { |n| "example#{n}@example.com" } password { 'password' } password_confirmation { 'password' } end end
UserFactoryの作成が完了しました。
sequence
は同一ではない適当な値が代入されます。
この場合、example1@example.com
、example2@example.com
、example3@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でテストを書くことにはまだまだ理解が追いついていないので、キャッチアップとアウトプットを繰り返して、身に付けれるように努力していきたいと思いました。