0

RecordNotFound例外を受け取ります。visitにCapybaraのページがあり、それはjs: true(Poltergeistドライバを使用して)で起きています。ポピュラージストとCapybaraを使用したRecordNotFound

マイ機能の仕様は次のようになります。

context 'existing submissions' do 
    background do 
     @problem = create(:problem) 
     @input = create(:input, problem: @problem) 
    end 
    scenario 'goes back and edits', js: true do 
     visit "/problems/#{@problem.id}/#{@input.lens}" 

そして、私はbyebugに落下するとき、私はこれを見ています:

[27, 36] in /Users/danielklasson/third_space/spec/features/user_completes_solving_process_spec.rb 
    30:  scenario 'goes back and edits', js: true do 
    31:  byebug 
=> 32:  visit "/problems/#{@problem.id}/#{@input.lens}" 
(byebug) visit "/problems/#{@problem.id}/#{@input.lens}" 
{"status"=>"success"} 
(byebug) 
*** ActiveRecord::RecordNotFound Exception: Couldn't find Problem with 'id'=1 

nil 
(byebug) Problem.all 
#<ActiveRecord::Relation [#<Problem id: 1, name: "My Problem", created_at: "2017-01-25 15:35:12", updated_at: "2017-01-25 15:35:12">]> 

そして、私のコントローラで、私は単純に、この持っている:

@problem = Problem.find(params[:id]) 

答えて

2

CapybaraでJSサポートドライバを使用すると、アプリケーションとテストはs別々のスレッドであり、それぞれがデータベースとの独自の接続を維持します。レールでのテストのデフォルト設定では、「トランザクション」テストが使用されます。これは、各テストの前にデータベーストランザクションが開かれ、テストの最後にトランザクションがロールバックされることを意味します。これは、トランザクションを開かれたコネクションを使用して新しいレコードを参照することを許可しながら、これらのレコードをDBにコミットすることは決してありません。しかし、複数の接続がある場合、2番目の接続を使用するものは、実際にはデータベースにないため、最初の接続で作成されたレコードは表示されません。これは、カピバラのREADMEに記載されている - https://github.com/teamcapybara/capybara#transactions-and-database-setup

このための最も簡単な解決策はdatabase_cleanerをインストールし、推奨設定でそれを設定することです - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

関連する問題