LoginSignup
29

More than 3 years have passed since last update.

posted at

updated at

Organization

【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を付与してやって、そちらで探すといいかもです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
29