我正在使用 rails 6.1.4 (Ubuntu 20.04) 并且正在使用 rspec、factorybot 和 capybara 運行測驗。我還得到了 database_cleaner,我正在使用 :truncation 以干凈的方式開始每個測驗塊(是的,不是最快的方式,而是最嚴格的方式)。當我運行時rspec spec(也適用于單個模型),我得到一張桌子,在那里我隨機得到一堆失敗的測驗說
Failure/Error: DatabaseCleaner.clean
ActiveRecord::Deadlocked:
PG::TRDeadlockDetected: ERROR: deadlock detected
DETAIL: Process 105987 waits for AccessExclusiveLock on relation 1876018 of database 1876015; blocked by process 105996.
Process 105996 waits for AccessShareLock on relation 1876043 of database 1876015; blocked by process 105987.
HINT: See server log for query details.
# ./spec/support/database_cleaner.rb:32:in `block (2 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# PG::TRDeadlockDetected:
# ERROR: deadlock detected
# DETAIL: Process 105987 waits for AccessExclusiveLock on relation 1876018 of database 1876015; blocked by process 105996.
# Process 105996 waits for AccessShareLock on relation 1876043 of database 1876015; blocked by process 105987.
# HINT: See server log for query details.
# ./spec/support/database_cleaner.rb:32:in `block (2 levels) in <top (required)>'
測驗開始失敗的地方確實是隨機的,即我可以連續運行相同的測驗命令,不同的測驗將通過/失敗。
在 ./spec/support/database_cleaner.rb [我刪掉了評論]
RSpec.configure do |config|
config.before(:suite) { DatabaseCleaner.clean_with(:truncation) }
config.before(:each) { DatabaseCleaner.strategy = :truncation }
config.before(:each, js: true) { DatabaseCleaner.strategy = :truncation }
config.before(:each) { DatabaseCleaner.start }
config.after(:each) do
[this is row 32:] DatabaseCleaner.clean
rescue NoMethodError => e # See: https://github.com/DatabaseCleaner/database_cleaner-sequel/issues/4
next puts("Warning: catch #{e.message}") if e.message == %(undefined method `rollback' for nil:NilClass (DB Cleaner gem))
raise e
end
end
有時,一段時間后,所有測驗也可能會起作用。有沒有人知道是什么導致了這個問題?謝謝!
uj5u.com熱心網友回復:
給資料庫清理器一些時間來完成它的作業!解決問題的一種虛擬方法是使用如下的 sleep 方法:
sleep(1),在每個“it”塊的開頭。應該做的作業?
正在發生的事情是資料庫清理器沒有時間清理您的 PSQL 資料庫,因為您已經在嘗試重新創建您在之前的測驗中使用的相同實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/473769.html
標籤:轨道上的红宝石 rspec 水豚 工厂机器人 数据库清理器
上一篇:如何檢查last_updated是否超過15.minutes.ago?
下一篇:如何合并兩個物件并保持計數
