2012-06-01 27 views
5

Tôi đang cố gắng lấy một số ví dụ RSpec làm việc với Capybara bằng trình điều khiển javascript (w/Webkit hoặc Poltergeist) nhưng có vấn đề về khóa với cơ sở dữ liệu khi cập nhật bảng. Đây là một phần của ví dụ được đề cập:Cơ sở dữ liệu hết giờ khi chạy RSpec/Capybara với trình điều khiển 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" 

Tôi đang sử dụng Devise và Warden::Test::Helpers để đăng nhập.

Chạy RSpec mất một thời gian và tất cả tôi nhận được:

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

Nhật ký cho thấy rằng có một cơ sở dữ liệu khóa vấn đề:

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 

Tôi đã thử rất nhiều thứ (câu hỏi dường như gần nhất với giải pháp thực tế: Capybara with :js => true causes test to fail) nhưng không có gì hiệu quả, thậm chí loại bỏ DatabaseCleaner. Có điều gì khác tôi có thể thử không?

Sửa: Dưới đây là các tập tin spec_helper.rb theo yêu cầu: https://gist.github.com/2855631

+0

Bạn có thể đăng tệp spec_helper của mình không? – DVG

+0

@DVG Tôi đã chỉnh sửa câu hỏi của mình bằng một liên kết tới gist. –

Trả lời

5

Đó là gần như chắc chắn

config.use_transactional_fixtures = true 

Đó là cố gắng để chạy ví dụ của bạn bên trong một giao dịch, với mục đích của việc có dữ liệu sạch. Vì bạn đang sử dụng Database Cleaner, bạn đã có tính năng này, vì vậy hãy đặt tính năng này thành false và bạn nên thực hiện tốt.

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

+0

Cảm ơn rất nhiều, điều này rất rõ ràng tôi sẽ không bao giờ tìm thấy nó bản thân mình! ;-) –

0

Đối với tôi, giải pháp là điều ngược lại :)

Tôi đã đặt nó vào false:

config.use_transactional_fixtures = false 

Và tất cả làm việc. Với true nó không hoạt động như trước đây.

Các vấn đề liên quan