【Rspec】fill_inがうまく動作せずとても悩んだので備忘録【capybara】



「現場で使えるRuby on Rails5 速習実践ガイド」Chapter5-8,5-11(FutureTest)のfill_inで詰まったので備忘録。


・環境
PC : MacBook Pro(2018)
OS : mac os Big Sur ver. 11.1
editor : Vscode ver.1.53.2
・言語&ライブラリ
Ruby : 2.6.3
RubyonRails : 6.1.1
Rspec : 3.10
Capybara : 3.34.0
FactoryBot : 6.1.0


ログインテスト失敗

Chapter5-8-3のRspec&Capybaraを使ったユーザーログインのテストで、

tasks_spec.rb
context 'ユーザーがAがログインしているとき' do
before do
    visit login_path #このURLでアクセスする
    fill_in 'メールアドレス', with: '[email protected]' #メールフォームに[email protected]を入力
    fill_in 'パスワード', with: 'password' #パスワードフォームにpasswordという文字列を入力
    click_button 'ログインする' #ログインボタンを押す
end

と教科書通り入力しても、エラーが出て実行されず、、、

どうやら、'メールアドレス'で、views側の入力フォームのラベルを指定しているのですが、
それがうまくいかずに、'[email protected]'がキチンと入力フォームに代入されていないことが原因のようです。

fill_inに参照させる値を変更する

つまり、ラベル以外の要素で参照させてあげれば、上手くいくのでは、、、?
と思い、Google Chormeの検証で、ソースコードを確認することに。(ソースコード直接見たらええやんって声も聞こえてきそうですが、この技術書ではHTML短縮記法のslimを用いて書いていますので今回は割愛。)
見てみると、、、
name="session[email]"の部分で読み込ませると、無事に値を渡せることができました!!

ハマると泥沼な凡ミス

ちなみにその後Chapter5-11で、値を渡す部分(with:'〇〇')がlogin_user.emailとlogin_user.passwordと言う変数に変わります。
理由としてはユーザーAだろうがユーザーBだろうが誰がログインしても同じログイン処理コードを使えるようするためなのですが、
その時に元々は文字列を入れていたのでシングルクォーテーションを付ける必要があったのですが、変数の場合は当たり前ですがシングルクォーテーションを外す必要があります。
自分はこの凡ミスで半日程無駄にしました、、、泣

まとめ

まとめると、
・fill_inはラベルで参照できない時は、view側(またはchromeの検証)を確認して、IDやnameを指定して上げてください!
・変数にシングルクォーテーションはダメ絶対!!

以上です。
最後まで閲覧頂き、誠にありがとうございました!!