2017-02-14 3 views
0

私は初心者ですが、私はcapybaraで "edit user"という機能をテストしようとしていますが、ここでCapybaraのフィーチャーテスト:アフターフックでエラーが発生しましたActiveRecord :: RecordNotFound:

An error occurred in an after hook

ActiveRecord::RecordNotFound: Couldn't find User with 'id'=

occurred at /var/lib/gems/2.3.0/gems/activerecord-4.2.5/lib/active_record/core.rb:155:in `find'

は私のテストコードです:

context 'when wrong parameters' do 
      scenario 'checkout name is mandatory' do 
      fill_in 'name', with: '' 
      fill_in 'email', with: '' 
      3.times { wait_for_ajax } 
      click_button '保存' 
      expect(page).to have_current_path('/users/1') 
      expect(page).to have_content 'お名前を入力してください' 
      end 

そして、ここでは私のspec_helper.rbとrails_helper.rbは

require 'factory_girl_rails' 

    RSpec.configure do |config| 
     config.expect_with :rspec do |expectations| 
     expectations.include_chain_clauses_in_custom_matcher_descriptions = true 
     end 

     config.mock_with :rspec do |mocks| 
     mocks.verify_partial_doubles = true 
     end 
    end 


ENV['RAILS_ENV'] ||= 'test' 
require 'spec_helper' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rspec/rails' 
require 'shoulda/matchers' 
require 'support/authentication_helper' 
require 'capybara' 
require 'support/wait_helper' 
require 'rake' 
require 'support/feature_testing_functions_helper' 

Rails.application.load_tasks 
ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    config.use_transactional_fixtures = true 
    config.infer_spec_type_from_file_location! 

    config.include FactoryGirl::Syntax::Methods 
    config.include Devise::Test::ControllerHelpers, type: :controller 
    config.include AuthenticationHelper 

    config.include Capybara::DSL, type: :feature 
    config.include Capybara::RSpecMatchers, type: :feature 
    config.include WaitHelper, type: :feature 
    config.include FeatureTestingFunctions, type: :feature 
    Capybara.default_driver = :webkit 
    config.before :suite do 
    Rake::Task['db:drop'].invoke 
    Rake::Task['db:setup'].invoke 
    end 
    config.after :each do 
    Capybara.reset_sessions! 
    end 
end 

Shoulda::Matchers.configure do |config| 
    config.integrate do |with| 
    with.test_framework :rspec 
    with.library :rails 
    end 
end 
です

このエラーがなぜ発生したのかわかりませんが、これをトラブルシューティングする方法についてアドバイスはありますか?

答えて

0

エラーは、問題が何であるかを伝えています。あなたはある種の要素負荷をアフターフックに持っています。あなたが投稿したコードのいずれかのアフターフックは表示されませんが、スタックトレースはエラーが生成されている場所につながります。あなたのテストで

他の問題は、あなたがJSが可能なドライバ(カピバラ-webkitの)を使用しているように見えるが、まだトランザクションのテストが有効になっている

  1. です。これにより、テストコードで作成したオブジェクト(FactoryGirlなど)がアプリに表示されなくなります。 -https://github.com/teamcapybara/capybara#transactions-and-database-setupを参照して、https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-exampleの推奨構成を使用してDatabaseCleanerをセットアップします。

  2. wait_for_ajaxを使用して停止する - wait_for_ajaxのようなものには約3つの有効な(非常にまれな)ニーズがあります。何も必要ないか、ひどいアプリデザインを指しています。リクエストを完了するためにボタンをクリックする前に待つ必要がある場合は、リクエストが完了したことを示すページ上の目に見える変化(Capybaraは自動的にページコンテンツの期待値を待つ/再試行する)を期待する必要があります。ボタンをクリックできるかどうかをユーザーがどのように知っておくべきかを変更しますか?

  3. 作成するオブジェクトのIDは特定の番号(/ users/1)になり、ハードコーディングパス名はルーティング名を変更すると脆弱なテストにつながることは想定できません。代わりに提供されたレールを使用してパスを確認してください。ですから、userという変数としてユーザオブジェクトを作成したと仮定すると - あなたはユーザーパスを持っているあなたのルートを変更した場合には、その方法

    expect(page).to have_current_path(user_path(user)) 
    

    だろうと、実際に/メンバー/すべてのテストが壊れないこと。

+0

問題についてのご意見やご感想をお寄せいただきありがとうございます。 "ActiveRecord :: RecordNotFound: 'id' ="のユーザーを見つけることができませんでした。ここでidは1に等しくなければならないが、等号の後に空白がある。それはなぜここに空ですか? –

+0

@ABあなたはユーザーを作成している場所(または訪問している場所)を表示していませんが、アプリコードでユーザーを見ることができない答えが#1ですトランザクション・データベースのテストのためにテスト・コードで作成したものです。あるいは、ユーザーを作成するのではなく、ビルドするためです。 –

関連する問題