2017-04-02 12 views
0

私の開発者のユーザーは:confirmableであり、登録後にユーザーがdeviseのログインページにリダイレクトされることをテストしたい。手動でテストすると動作しますが、rspec/capybaraの機能仕様では失敗します。リダイレクトを設定する手順は、theseです。確認のためのafter_inactive_sign_up_path_for確認可能なリダイレクト

# registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 
    protected 

    def after_inactive_sign_up_path_for(_resource) 
     new_user_session_path # redirect to login 
    end 
end 



# registration_spec.rb 
RSpec.describe 'registration process', type: feature do 
    it 'works' do 
     visit new_user_registration_path 
     fill_in 'Username', with: 'user123' 
     fill_in 'Email', with: '[email protected]' 
     fill_in 'Password', with: 'password123' 
     fill_in 'Password confirmation', with: 'password123' 
     click_on 'Sign up' 
     expect(User.find_by(username: 'user123')).not_to be_nil # sanity check 
     expect(page).to have_current_path(new_user_session_path) # failure here 
    end 
end 

返さ失敗:

Failure/Error: expect(page).to have_current_path(new_user_session_path) 
     expected "/users" to equal "https://stackoverflow.com/users/sign_in" 
    # ./spec/features/registration_spec.rb:19:in `block (2 levels) in <top (required)>' 

それはpageのように思えるが、ポスト・パスでスタックしている、または正しく/usersにリダイレクトされていますか?私はフォームがユーザーが存在するという私の健全性チェックのために入力を受け入れていることを知っています。

答えて

0

ほとんどの場合、既存のユーザーまたはパスワードが最低限のセキュリティ要件を満たしていないなどの理由で、ユーザー作成が失敗している可能性があります。クリック後にpage.htmlを出力すると、検証エラーが表示されるはずです。そうでない場合はtest.logも表示されます。

さらに、click_onは非同期(JS対応ドライバを使用している場合)であるため、テストの最後の2行をスワップする必要があります。have_current_pathはユーザーの作成が完了したことを示すページ変更が行われるまで待機するためです。それはあなたの現在の問題を解決するものではありませんが、直接データベースクエリを実行する前にアクションが完了したことを確認するためにカピバラのマッチャを使用することで、将来の潜在的な脆弱性が減少します(ただし、データベースの直接クエリは、機能テスト)。

関連する問題