2016-12-11 8 views
0

capybaraを使用してログインフォームをテストしようとしていますが、電子メールまたはパスワードフィールドは見つかりません。Capybaraが正しいIDでフォームフィールドを見つけることができません

私は正しいIDを使用していることを確認するためにページソースを確認しましたが、フィールド名を使用しても試しました。

it "returns http success" do 
     user = FactoryGirl.create(:user) 
     visit sessions_new_path 
     fill_in 'email', :with => user.email 
     fill_in 'password', :with => user.password 
     click_button('submit') 
     expect(response).to have_http_status(:success) 
    end 

マイ形式:

= form_for(:session, url: login_path, :html => {class: 'login_form'}) do |f| 
    .field 
     = f.email_field :email, 'data-msg-required' => t('email_required'), :placeholder => t('.form_email'), id: 'email' 
    .field 
     = f.password_field :password, 'data-msg-required' => t('password_required'), :placeholder => t('.form_pwd'), id: 'password' 
    = f.submit t('.form_sbmt'), class: 'btn-submit' 

IDが(それぞれのフィールド用)メールアドレスとパスワードとしてリストされているページのソースを表示し、名前をここで

は私の現在のテストです「session [email]」の形式に従ってください。私はfill_inのために "sessions [email]"(とパスワードのためのequiv)を使ってみましたが、運がありませんでした。

エラー私は取得しています:任意の助けをいただければ幸いです

Failure/Error: fill_in 'email', :with => user.email 

    Capybara::ElementNotFound: 
     Unable to find field "email" 

答えて

1

Capybaraはコントローラテストでは使用されません。 Capybaraは、アプリケーションのエンドツーエンドテスト(機能テスト)に使用され、コントローラのテストに限定されません。あなたのアクションのコントローラーテストは、非常に速く、ビューをレンダリングする必要はありません。

it "returns http success" do 
    user = FactoryGirl.create(:user) 
    post :create, session: { email: user.email, password: user.password} 
    expect(response).to have_http_status(:success) 
end 

のようなものでなければなりません。

0

私は答えを見つけました。私はRspecがコントローラテストを実行するときにビューをレンダリングしないことを認識しませんでした(ビューが別々にテストされることを期待しているので)。コントローラーテストを表示するために、renders_viewをdescribe-doブロックの1つに追加するだけです(ただし、it-doブロック内にはありません)。

私のテストは現在動作しているようです。

コメントで説明したように、実際には適切な回答ではありません。

+0

Capybaraをコントローラテストで使うべきではありません。これはフィーチャテスト(そしてビューテストのマーシャー)のためです。 –

+0

私はそれを認識していますが、私のセッションの作成アクションをテストする方法がわかりませんでした。私が投稿を投稿しようとしたとき、私はそれを動作させることができませんでした。 – Isengrim

+1

コントローラテストで間違ったことをテストしているようです。完全なコントローラ/ビュー/ルーティングテストを行う場合は、機能テストを行う必要があります。コントローラテストを作成する場合は、コントローラが設定した変数とコントローラアクションからの応答のみをテストする必要があります。あなたの例では、コントローラテストは基本的に 'post:create、session:{email:user.email、password:user.password}のようなものです。期待(応答)... ' –

関連する問題