こんにちは。
最近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ファイルで引数に変更したい属性と値を渡すことで、すでに定義したデータの一部を変更できます。
参考資料
FactoryBotでfixtureのデータを変更する方法 - Qiita
RSpec の letとlet!とbeforeの挙動と実行される順番 - Qiita
Rspec letとcreateが表すもの。 - Qiita
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
日々勉強です。
以上、ハチマキでした。