hotoolong's blog

RailsやVim、業務で気になったことを綴ってます

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つできてしまったのですが、 改善方法としてはいくつかあります。

特に同じ名称が合っても問題ない場合

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

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

そもそもFactoryBotで複数の同じ名称を作りたく無いケースは

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

と記載すると上手く行きますね。

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