Edited at

【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パスワード"

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

スクリーンショット 2019-02-06 0.45.44.png

見事に何も入ってない。

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


fill_inの書き方を変える

失敗時のコードがこちら。

テスト側

context 'ユーザーがAがログインしているとき' do

before do
# ユーザーAでログインする
visit login_path
fill_in "email", with: 'a@example.com'
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: 'a@example.com'
fill_in "password", with: 'password'

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

   fill_in "session_email", with: 'a@example.com'

fill_in "session_password", with: 'password'

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

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