2012-06-01 1 views
5

Ich versuche, einige RSpec Beispiele mit Capybara mit dem Javascript-Treiber (w/Webkit oder Poltergeist) arbeiten, aber es gibt ein Sperrproblem mit der Datenbank beim Aktualisieren einer Tabelle. Hier ist ein Teil der in Frage:Datenbank Timeout beim Ausführen von RSpec/Capybara mit Javascript-Treiber

scenario 'by changing the contract attributes', js: true do 
    login_as @admin, scope: :user 

    contract = Contract.create(number: '123', 
           start_at: Date.today, 
           end_at: Date.today + 1.month) 

    visit "/contracts/#{contract.id}/edit" 

Ich bin mit Einfallsreichtum und die Warden::Test::Helpers einzuloggen.

RSpec Rennen dauert eine Weile, und alles, was ich bekommen:

Failure/Error: visit "/contracts/#{contract.id}/edit" 
Capybara::Driver::Webkit::WebkitInvalidResponseError: 
    Unable to load URL: http://127.0.0.1:46520/contracts/1/edit 

Das Protokoll zeigt, dass es eine Datenbank Sperr Ausgabe:

Started GET "/contracts/1/edit" for 127.0.0.1 at 2012-06-01 12:10:26 -0400 
    (0.2ms) BEGIN 
    (51083.3ms) UPDATE `users` SET `last_sign_in_at` = '2012-06-01 16:10:26', `current_sign_in_at` = '2012-06-01 16:10:26', `last_sign_in_ip` = '127.0.0.1', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 1, `updated_at` = '2012-06-01 16:10:26' WHERE `users`.`id` = 1 
Mysql2::Error: Lock wait timeout exceeded; try restarting transaction: UPDATE `users` SET `last_sign_in_at` = '2012-06-01 16:10:26', `current_sign_in_at` = '2012-06-01 16:10:26', `last_sign_in_ip` = '127.0.0.1', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 1, `updated_at` = '2012-06-01 16:10:26' WHERE `users`.`id` = 1 
    (0.8ms) ROLLBACK 

Ich habe versucht, viele Dinge (diese Frage schien am nächsten zu einer tatsächlichen Lösung: Capybara with :js => true causes test to fail), aber nichts hat funktioniert, sogar loszuwerden DatabaseCleaner. Kann ich noch etwas versuchen?

bearbeiten: Hier ist die spec_helper.rb Datei wie gewünscht: https://gist.github.com/2855631

+0

Können Sie Ihre spec_helper-Datei posten? – DVG

+0

@DVG Ich habe meine Frage mit einem Link zu gist bearbeitet. –

Antwort

5

Es ist fast sicher

config.use_transactional_fixtures = true 

Welches ist Ihr Beispiel innerhalb einer Transaktion, für die Zwecke der mit sauberen Daten auszuführen versucht. Da Sie Database Cleaner verwenden, verfügen Sie bereits über diese Funktion. Setzen Sie dies also auf "false", und Sie sollten fortfahren.

https://www.relishapp.com/rspec/rspec-rails/docs/transactions

+0

Vielen Dank, das war so offensichtlich, ich hätte es nie selbst gefunden! ;-) –

0

Für mich war die Lösung genau das Gegenteil :)

ich es false gesetzt haben:

config.use_transactional_fixtures = false 

Und alles funktionierte. Mit true funktionierte es nicht wie vorher.