2012-06-01 4 views
5

Estoy tratando de obtener algunos ejemplos de RSpec trabajando con Capybara usando el controlador javascript (w/Webkit o Poltergeist) pero hay un problema de bloqueo con la base de datos al actualizar una tabla. Aquí es parte del ejemplo en cuestión:Tiempo de espera de la base de datos al ejecutar RSpec/Capybara con el controlador de Javascript

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" 

estoy usando Diseñar y el Warden::Test::Helpers para iniciar sesión.

Correr RSpec toma un tiempo y todo lo que consigo:

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

El registro está demostrando que hay un problema de bloqueo de la base de datos:

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 

He intentado un montón de cosas (que pregunta pareció más cercano a una solución real: Capybara with :js => true causes test to fail) pero nada funcionó, incluso deshacerse de DatabaseCleaner. ¿Hay algo más que pueda probar?

Editar: Aquí está el archivo spec_helper.rb conforme a lo solicitado: https://gist.github.com/2855631

+0

¿Puedes publicar tu archivo spec_helper? – DVG

+0

@DVG He editado mi pregunta con un enlace a gist. –

Respuesta

5

Es casi seguro que

config.use_transactional_fixtures = true 

que está tratando de hacer funcionar su ejemplo en el interior de una transacción, con el fin de tener datos limpios. Ya que está utilizando el limpiador de base de datos, ya tiene esta función, configure esto como falso y debería estar listo para continuar.

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

+0

Muchas gracias, esto fue tan obvio que nunca lo hubiera encontrado yo! ;-) –

0

Para mí la solución era todo lo contrario :)

púsela a false:

config.use_transactional_fixtures = false 

Y todo funcionó. Con true no estaba funcionando igual que antes.

Cuestiones relacionadas