hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

Capybaraでselect時に同じ名称のvalueがありエラーになってしまう

RSpecでCapybaraのテストをしてたのですが、

select '東京都', from: '都道府県'

と記載している箇所で

Capybara::Ambiguous:
   Ambiguous match, found 2 elements matching visible option "東京都" within #<Capybara::Node::Element tag="select" path="/html/body/div/div/div[3]/div[2]/div/div/form/div[8]/select">

のようなエラーが出てしまいました。

FactoryBotの記載方法が悪かったようで、同じ東京都が2つできてしまったのですが、 改善方法としてはいくつかあります。

1点目としては
特に同じ名称でどちらも使っても問題ない場合

select '東京都', from: '都道府県', match: :first

とspecを修正することで免れることができます。 これはシンプルですね。

2点目としては FactoryBotで同じ名称を作りたく無いケース

FactoryBot.define do
    factory :prefecture do
      id 13
      sequence(:name) { |n| "東京都-#{n}" }

とsequenceを利用するとnにインクリメントされた数値が代入されまwす。 このように記載すると上手く行きますね。

本質的な問題として rails_spec.rb に固定させるデータを beforeで作ってしまうというのもいいのかもしれませんが、 今回はそれ以外の対処方法を考えてみました。