LoginSignup
1
1

More than 3 years have passed since last update.

【RSpec】「都道府県」を表示させるため、View側でDB参照した部分のテストでハマった

Posted at

はじめに

まとめをかきます。

  • テスト実行時には、DBのレコードは空っぽです。マスターテーブルをView側で参照した部分のテストでは事前にレコードをつくりましょう。
  • さもないと「ブラウザで動いてるのに、テスト時だけコケる」ので注意しましょう。
  • ActiveHashに置き換えると、db:seedの手間もなくなり、変更も容易になります

    -------✁-------✁-------✁-------✁-------

※以下は、解決までにどのようなことを考えて試したかの話になります。
筆者自身への備忘録な成分が多めですのでご了承ください。

開発の環境

  • Rails 6.0.2
  • Ruby 2.7
  • simple_form 5.0.2
  • RSpec 3.9.1

住所の都道府県の選択をPrefectureテーブルとsimple_formで実装

Prefectureはnameだけをもつ、都道府県のマスターテーブルです。

app/views/addresses/_form.html.haml
= f.input :prefecture, selected: "東京都", collection: Prefecture.all, label_method: :name, value_method: :id

こうすると、こう。

image.png

Prefectureテーブル用に以下のseedをつかいました。

prefecture_seed.rb
prefs = %w[北海道 青森県 岩手県 宮城県 秋田県 山形県 福島県 茨城県 栃木県 群馬県 埼玉県 千葉県 東京都 神奈川県 新潟県 富山県 石川県 福井県 山梨県 長野県 岐阜県 静岡県 愛知県 三重県 滋賀県 京都府 大阪府 兵庫県 奈良県 和歌山県 鳥取県 島根県 岡山県 広島県 山口県 徳島県 香川県 愛媛県 高知県 福岡県 佐賀県 長崎県 熊本県 大分県 宮崎県 鹿児島県 沖縄]

insert_prefs = prefs.map {|pref| {name: pref, created_at: Time.current, updated_at: Time.current } }    

Prefecture.insert_all!(insert_prefs)

System Testでセレクト要素を選択する部分がコケた【今回の問題点】

「新規住所を登録する」Specをつくりました。

addresses_spec.rb
visit new_user_address_path(user)
select "高知県", from: "都道府県"

すると、ElementNotFoundがでました。("高知県" がみつかっていない)

ブラウザで実行すると表示される

ブラウザではたしかに表示されているし、期待通りの動きをしているのに、、、、なぜだ。。。

スクショを確認すると、セレクト要素が空白

System Specが落ちたときのスクショを確認すると、セレクト要素が空白でした。(ここで気づきたかった!)

頭の中は「?? :thinking: ??」

IDEを起動したりしました。

ためしたこと 1.配列を直接わたすとパスする

simple_formのcollectionが動いていない?

app/views/addresses/_form.html.haml
= f.input :prefecture, selected: "東京都", collection: ["東京都", "高知県"]

書き換えてみると、テストはパスしました。

ためしたこと 2.ActiveHashにするとパスする

gem 'active_hash'
bundle install

したあとに、2都県の日本でためしてみました。

app/models/prefecture.rb
class Prefecture < ActiveHash::Base
  field :name
  add id: 1 , name: "北海道"
  add id: 2 , name: "高知県"
end

パスします。
あとで調べてわかったのですが、ActiveHash化した Prefecture.all は単に配列を返すので、1.の検証とおなじ挙動になります。

テスト実行時は「レコード0件の世界」であることに気づく【解決】

要素が表示されない。

Prefecture.allはエラーではない。

つまりレコードが存在しない。

なぜ・・・

時計の長針が1周しようかというところで、ついにテスト実行時は「レコード0件の世界」であることに気づくわけです。長かった。

スペック内でPrefectureにレコードをつくるとパスする

検証。

addresses_spec.rb
Prefecture.create!(name: "東京都")
Prefecture.create!(name: "高知県")

visit new_user_address_path(user)

select "高知県", from: "都道府県"

パスしました。

さいごに

ここまで読んでいただきありがとうございました。

普段の記事では、問題に対する答えだけをかくようにしていますが、今回は「どのようにして解決に至ったか」までの道のりをかいてみました。

「simple_formの使い方がまちがっているんだろう」というところから、おなじ問題がIssueにあがってないかと公式レポジトリを検索したり、迷走の極みでした。

人に聞くと解決するメソッド

気づいてしまえばなんでもないことほど深くハマってしまうことがあります。筆者の場合は、チャットで質問しようと文章を書いているときに :qiitan::bulb:解決しました。

ハマったときこそ考え込まず、文章 :writing_hand: にしたり、他の人に説明 :speaking_head: してみるといいかもしれません。

追伸:PrefectureはActiveHashにしました。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1