気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

【spec】factory dateの一部を変更したテストの書き方

こんにちは。

最近1週間が秒で終わります。もう29歳なので年でしょうか。。

どうもハチマキです。

はじめに

先日deviseを実装し、factoriesのUserモデルスペックに「confirmed_at Time.now」を定義しました。
こう定義することで、すでに本登録済み状態となり、仮登録状態から本登録済みにするテストを書きたい時に、また新しくfactoriesにUser情報を定義する必要があるのか??と思い調べてみました。

結論、新たに定義する必要はなく解消できたので、この方法について書いていきたいと思います。

では早速行きましょう!

本日の概要 : factory dateの一部を変更したテストの書き方

事象

※deviseを実装した時を想定して進めていきます

ユーザー仮登録から本登録までのfeatureテストを追加したい。
すでに「confirmed_at Time.now」を定義したことによって、すでに本登録済みのなので、仮登録状態を作るためにfactoriesで定義したuserデータの一部変更したい。

実行方法

実行方法を調べていくと、解決方法は3つほどあることが見えてきました。
その中でも簡単にできる「specファイルに定義」する方法を紹介していきます。

・spec/factories/user.rb

factory :user, class: 'User' do
   sequence(:firstname) {|n| "hachimaki#{n}"}
   sequence(:lastname) {|n| "makitai#{n}"}

   email { Faker::Internet.email }
   gender 'man'
   birthday Date.new(1991, 1, 18)
   confirmed_at Time.zone.now
end

・spec/features/user_spec.rb

feature 'user.rb', js: true do
 let!(:admin) { create(:admin_user) }
 let!(:user) { create(:user, confirmed_at: nil) }

 before do
  sign_in(admin)
 end

 context '~~' do
  scenario '~~ do
   visit '~~'
   click '登録する'
      
   expect(page).to have_content '登録完了'
  end
 end
end

specファイルで引数に変更したい属性と値を渡すことで、すでに定義したデータの一部を変更できます。