2013-01-10 7 views
8

benim gözlük kırmak database_cleaner yapar . Veri tabanı, kesme stratejisi kullanılarak database_cleaner kullanılarak her bir testten sonra temizlenir.yükseltiliyor Kapibara ben Kapibara sürümünü 1.0.1 kullanıyorum ve selenyum sürücüsünü kullanarak çalışan yazılı istek özellikleri bir yeri vardır sürümü 3.2.11 yükseltilmiş eski raylar uygulama var

Ben poltergeist en son sürümünü kullanmak mümkün 1.1.4'e 1.0.1 den hortlak yerine selenyum ve yükseltilmiş Kapibara kullanmak istiyorum. Sadece capybara gem (ve onun bağımlılıkları) değiştirerek benim specs çalıştıran sorunlar tanıttı.

Ben tutarlı bir şekilde her spec sonra temizlik işleyicisi benim Postgresql veritabanından hataları kilitlenmeye olsun. Benim spec_helper oldukça basit ve şöyle görünür: Ben olsun

RSpec.configure do |config| 
    config.mock_with :rspec 

    config.use_transactional_fixtures = false 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 
end 

hata şu şekildedir:

An error occurred in an after hook 
    ActiveRecord::StatementInvalid: PG::Error: ERROR: deadlock detected 
DETAIL: Process 41747 waits for AccessExclusiveLock on relation 17612 of database 16396; blocked by process 41752. 
Process 41752 waits for RowExclusiveLock on relation 17529 of database 16396; blocked by process 41747. 
HINT: See server log for query details. 
: ALTER TABLE "aaa" ENABLE TRIGGER ALL;ALTER TABLE "bbbb" ENABLE TRIGGER ALL;ALTER TABLE "ccc" ENABLE TRIGGER ALL; 
    occurred at /xxx/.bundle/gems/activerecord-3.2.11/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `async_exec' 

Ben IMO test verilerini ama aksi özel bir şey oluşturmak için FactoryGirl kullanın.

Ben database_cleaner tarafından oluşturulan çıkmazdan diğer ucunu tutan anlamaya edemedik. Bunu anlamak için herhangi bir fikir en çok hoş geldiniz.

Herkes değişti ve bu sorunları neden olmaya başladı olabileceği Kapibara 1.0.1, 1.1.4 arasındaki herhangi bir değişiklik biliyor?

+0

tam tersi. Testlerim arasında aralıklı olarak 1.1.2'den 1.1.1'e kadar kapybara'ya geçiş yapana kadar deadlock'ler vardı. Üzgünüm, yorumum daha yararlı değil. =/ –

+0

Peki ben deadlock sorunları yaşayan tek kişi değilim çünkü sevindim :-) Ben sadece aynı anda iki iş parçacığı aynı anda tablolara erişiyor neden göremiyorum. DatabaseClean sadece gerçek testler tamamlandıktan sonra çalışmalıdır ... – HakonB

+0

Ayrıca, bu aptalca bir soru olabilir, ancak DatabaseCleaner geminizi güncellemeyi denediniz mi? Ayrıca, FWIW Bence hatalar sadece biz gecikmiş_job kullanmaya başladıktan sonra ortaya çıkmaya başladı (testler için kapatmış olsak da). –

cevap

5

Ben adımın sonunda

sleep 0.2 

yerleştirerek salatalık bu soruna var (veya senin durumunda "Spec" olarak) bazı AJAX şeyler yapar. JS sürücüsü hala ajax yanıtı beklerken, salatalık/rspec veritabanı temizleyicisini çağırır.

+0

Benim için çalıştı. Garip görünüyor, bununla karşılaşan daha fazla insan yok. –

+0

Benim için de çalışıyordu. Görmede gerçek bir çözüm var mı? – morgler

+0

Bu, çalışmayı gereksiz yere yavaşlatır ve bazen yavaşlatır ve bazen başarısız olabilir. Düzeltme, testin sonunda Capybara API'sine (has_content? Gibi) çağrı yapmaktır. Aşağıdaki cevapta detaylandırdım. –

5

düzeltme sleep kullanmak ancak bekleneni beklemek sadece Capybara API yöntemleri kullanmak değildir.

Aşağıda

, hat 2 başarısız (current_path olmayan bekleyen, ancak satır 3 eser (has_selector? bekler gibi). Jonas Nicklas' makalesine Aşağıdaki bağlantı iyice açıkladığı gibi.

click_on 'signup_button' # Which does an AJAX redirect to /dashboard 
assert_equal dashboard_path, current_path # This causes the deadlock error as Capybara doesn't wait. 
assert page.has_selector?("#dashboard") # This works as it causes Capybara to wait for the new page. 

http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara

+0

Bunun sadece Capybara 2'de çalıştığından eminim. Capybara <2'de denediniz mi? –

1
kullandığımız

çözüm başarılı ajax çağrısına yanıt olarak değişmelidir sayfasında şey bulmak için bir şey gibi yani. aslında experien

click_on('Save') 
expect(page).to have_content('Saved') 
İlgili konular