FakerBotを使ってActiveHashを含んだテストコードを作成しようとした際、問題が発生してしまったので、その問題と解決法を書いていきます。
問題点:FactoryBotがバリデーションにかかるidを選択してしまい、テストに失敗する
class Prefecture < ActiveHash::Base
self.data = [
{ id: 1, name: '---' },
{ id: 2, name: '北海道' },
{ id: 3, name: '青森県' },
class Item < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
validates :prefecture_id, numericality: { other_than: 1 }
選択肢の'---'に該当するprefecture_id: 1を選択すると、バリデーションにかかるように設定してあります。
FactoryBot.define do
factory :item do
prefecture { Prefecture.all.sample }
しかし上記のprefecture { Prefecture.all.sample }では、FactoryBotを生成時にバリデーションに設定したprefecture_id: 1も選択されてしまい、テストが失敗することがあるので、それを阻止したいところです。
解決策:collection_selectのオプションに値のない選択肢を追加する
<%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {include_blank: "---"}, {class:"select-box", id:"item-prefecture"}) %>
collection_selectの第5引数にinclude_blank: "---"
を記述します。
このinclude_blankオプションを使うことにより、値のない選択肢
を追加することができました。
これによりバリデーションに設定していた選択肢"---"は値を持たなくなったため、FactoryBot生成時に"---"が選択されることがなくなり問題が解決しました。