2017-07-26 9 views
0

次のフォームをテストしようとしています。このフォームでは、チェックボックスをオンにしてプロファイルを非表示にすることができます。CapybaraチェックボックスがJSをトリガーしていませんか?

このチェックボックスをオンまたはオフ(変更)にすると、JSを使用してフォームが送信されます。

コントローラ内のコントローラのアクションとメソッドは、:hidden booleanを切り替えます。

# accountsController 

    def toggle_hidden 
    @account = current_user.account 
    @account.toggle_hidden! 
    end 

    # account.rb 

    def toggle_hidden! 
    toggle!(:hidden) 
    end 

私はRspecとカピバラを使用しています。私のテストは以下の通りです

require 'rails_helper' 

feature 'Hide and show profile' do 
    let(:account) {create :account} 

    scenario 'successfully', js: true do 
    login_as(account.user) 
    visit dashboard_path 

    expect(account.hidden).to eq(false) 

    expect(page).to have_field('hide') 
    check('hide') 
    expect(page).to have_field('hide', checked: true) 

    expect(account.hidden).to eq(true) 
    end 
end 

テストエラーです。

Failures: 

1) Hide and show profile successfully 
Failure/Error: expect(account.hidden).to eq(true) 

    expected: true 
     got: false 

    (compared using ==) 

すべてのヘルプは非常にこれが動作することはできません理由として高く評価され..

EDIT

私は、チェックボックスが/未チェックチェックされているときに表示されるフラッシュ通知を追加しました。

def toggle_hidden 
    @account = current_user.account 
    @account.toggle_hidden! 
    respond_to do |format| 
    format.js { flash[:notice] = "Hidden toggled" } 
    end 
    end 

と仕様を更新しましたが、テストに合格しません。

expect(page).to have_content('Hidden toggled') 

答えて

0

あなたはすでにaccountをロードしているので、オブジェクト内のhiddenの値が変更されません。アクションが(ETC /クリック/オフ/チェック)それらによってトリガすべての行動を待つことは保証されませんので、あなたがオブジェクトに

expect(account.reload.hidden).to eq(true) 

をリロードする必要があると思い、新しい値を見るためにしかし、それは可能性が高いです期待通りの時間が過ぎるまでにフォーム提出が完了していない(したがってオブジェクトが更新されていない)ため(なぜ、データベースオブジェクトに対する期待が一般にフィーチャ仕様で悩まされているのか)フォームの送信が完了したときにページに目に見える変化がある場合は、データベースオブジェクトをチェックする前にその期待値を設定するか、データベースオブジェクトのテストをスキップして、実際にユーザーが実際に見ることができる彼らは箱をチェックした後。

+0

こんにちはThomas、入力いただきありがとうございます。チェックボックスをオンにしたときに表示されるフラッシュ通知と、そのコンテンツにはまだ運がないという期待が追加されています。私はこれを反映するために質問を更新しました。 – RailsJohn

+0

@RailsJohn - 新しい期待は失敗していますか?それとも、それは通過し、古いものはまだ失敗しますか?古いものがまだ失敗している場合は、呼び出しに 'reload'を追加して、古い値をチェックしていないことを確認してください。新しいメッセージが表示されない場合は、質問に表示されている正確なエラーメッセージを追加してください。ああ、JSレンダリングレスポンスのためにすぐに設定する必要があるので、 'flash [:notice]'ではなく 'flash.now [:notice]'を設定したいと思っています。 –

+0

私は最初にあなたの最初の提案を試しました。 .reload.hidden).toに渡されなかったeq(真)。その後、まだ渡されなかったフラッシュ通知(実行中の通知と通知なし)を実装しました。チェックボックスをオンにすると、フォームが送信されていないように見えるため、フラッシュは表示されず、レコードも更新されません。 – RailsJohn

関連する問題