【RSpec/capybara】fill_inが上手く動作しない


現場で使えるRuby on Rails5 速習実践ガイドの、Chapter5-8(テスト周り)で詰まったのでメモ。

ログインのテストに失敗

RSpecのfill_inというメソッドを使って、ログインフォームに値を渡した後、投稿が反映されているか確認するというテストでしたが、下記のエラーが出て何度やっても上手くいかず。


Failures:

1) タスク管理機能 一覧機能表示 ユーザーがAがログインしている時 ユーザーAが作成したタスクが表示される
Failure/Error: expect(page).to have_content '最初のタスク'
expected to find text "最初のタスク" in "Taskleaf\nログイン\nメールアドレス\nパスワード"

エラーのスクショを確認したところ、ログイン失敗どころかログインフォームに値を渡すことすら出来てなかったことが判明。

見事に何も入ってない。

どうやら間違えていたのはfill_inの使い方だったようです。

fill_inの書き方を変える

失敗時のコードがこちら。
テスト側

context 'ユーザーがAがログインしているとき' do
 before do
  # ユーザーAでログインする
  visit login_path
  fill_in "email", with: '[email protected]'
  fill_in "password", with: 'password'
  click_button 'ログインする'
 end

ビュー側

h1  ログイン

= form_with scope: :session, local: true do |f|
  .form-group
    = f.label :email, 'メールアドレス'
    = f.text_field :email, class: 'form-control', id: 'session_email'
  .form-group
    = f.label :email, 'パスワード'
    = f.password_field  :password, class: 'form-control', id: 'session_password'
  = f.submit 'ログインする', class: 'btn btn-primary'

教科書通りにやっても上手く値を渡せず...


   fill_in "email", with: '[email protected]'
   fill_in "password", with: 'password'

試しにこちらのコードを、

   fill_in "session_email", with: '[email protected]'
   fill_in "session_password", with: 'password'

このように、labelでなくテキストフィールド側のIDに合わせてみたところ、無事に値を渡せて、テスト通りました!

ラベルテキストで上手く特定が出来ないときは、テキストフィールドにIDを付与してやって、そちらで探すといいかもです。