FactoryBot でselect boxで選択するenumにハマった話
プログラミングを本格的にスタートして3ヶ月目に入りましたさかもとです。
今回はFactoryBotでselect boxを選択するテストを定義する際に沼ってしまった!という話をアウトプットしようと思います。
FactoryBotとは
Rspecでテストを実行する際にテスト毎に
@user = User.new( name: " ", email: " " ......... )
と定義するのは非常に面倒です。
そこでFactoryBot!gemをインストールしspec/factories/user.rbのようにファイルを生成しそこにモデルを定義してあげることで可読性と汎用性をあげることができます。
enumとは
ここでは本題とそれるので詳細は省くが列挙型といって指定された定数を保持することができる。
こちらの方の記事がわかりやすかったので確認してください。
本題
今回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を参考に確認しましたが特に問題はなさそう。。。
ここで完全にわからなくなります。
そこで今度はテストの記述に目を向けました。そこで気付きます。
fill_inは記述する際に用いられるものでは?
そう。今回のStatusはenumにありがちなselect boxから選択し登録するものだったのです。
そうすると記述の仕方は
fill_in 'Status', with: task.status
これから
select task.status, from: 'Status'
に変わります。
これでテストも無事走りました。
参考記事
列挙型(enum)の基本的な使い方とコード例 - Qiita
https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#enum-traits