現場で使える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: '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を付与してやって、そちらで探すといいかもです。