FactoryBot でselect boxで選択するenumにハマった話

プログラミングを本格的にスタートして3ヶ月目に入りましたさかもとです。

今回はFactoryBotでselect boxを選択するテストを定義する際に沼ってしまった!という話をアウトプットしようと思います。

 

FactoryBotとは

Rspecでテストを実行する際にテスト毎に

@user = User.new( name: " ", email: " " ......... )

と定義するのは非常に面倒です。

そこでFactoryBot!gemをインストールしspec/factories/user.rbのようにファイルを生成しそこにモデルを定義してあげることで可読性と汎用性をあげることができます。

 

enumとは

ここでは本題とそれるので詳細は省くが列挙型といって指定された定数を保持することができる。

こちらの方の記事がわかりやすかったので確認してください。

qiita.com

 

本題

今回FactoryBotでこのenumをカラムにもつtaskモデルを定義しシステムスペックにincludeしテストに活用するという課題がありました。

そこで

spec/factories/tasks.rb

(省略)

factory :task do

    name { "書類作成" }

    status { "todo" }

end

このように設定しテストを実行するusers_spec.rbでは

let(:task) { FactoryBot.build(:task) }

と定義してモデルを作成。実際のテストでは

it '新規作成したタスクが表示される' do

    visit new_task_path

    fill_in 'Name', with: task.name

    fill_in 'Status', with: task.status

    (省略)

end

これで完璧!のはずでしたがテストを走らせるとStatusが見つけられないと怒られてしまいます。

ここで沼ってしまいました。

 

解決策

binding.pryを挟み、webdriversでスクリーンショットを確認してみるとどうやらnameは作成されていました。

つまりFactoryBotは起動していて定義されています。

問題点はenum型の記述間違いだと予想をたて下記git hubを参考に確認しましたが特に問題はなさそう。。。

github.com

ここで完全にわからなくなります。

そこで今度はテストの記述に目を向けました。そこで気付きます。

fill_inは記述する際に用いられるものでは?

そう。今回のStatusはenumにありがちなselect boxから選択し登録するものだったのです。

そうすると記述の仕方は

fill_in 'Status', with: task.status

これから

select task.status, from: 'Status'

に変わります。

これでテストも無事走りました。

 

参考記事

列挙型(enum)の基本的な使い方とコード例 - Qiita

RSpec入門 6.システムスペック - Qiita

https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#enum-traits