У меня есть фрагмент кода, куда я импортирую BankAccountTransaction
в BankAccount
bank_account.with_lock do
transactions.each do |transaction|
import(bank_account, transaction)
end
end
все работает нормально, но мне нужно записать в него регистр RSpec, чтобы я был на 100% уверен, что я не импортирую транзакции дважды.
Я написал следующий помощник
module ConcurrencyHelper
def make_concurrent_calls(function, concurrent_calls: 2)
threads = Array.new(concurrent_calls) do
thread = Thread.new { function.call }
thread.abort_on_exception = true
thread
end
threads.each(&:join)
end
end
и я звоню по RSpec
context 'when importing the same transaction twice' do
subject(:concurrent_calls) { make_concurrent_calls(operation) }
let!(:operation) { -> { described_class.call(params) } }
let(:filename) { 'single-transaction-response.xml' }
it 'creates only one transaction' do
expect { concurrent_calls }.to change(BankaccountTransaction, :count).by(1)
end
end
но ничего не происходит, тестовый костюм застревает на этом этапе и не выдается никаких ошибок или чего-то в этом роде.
Я поставил точку отладки (byebug
) сразу после того, как я создал экземпляр потока и попытался вызвать функцию, и она работает нормально, но когда я присоединяюсь к потокам, ничего не происходит.
То, что я до сих пор пробовал
- точка останова до
threads.each(&:join)
и вызов функции (работает нормально)
- точка останова в примере rspec и отладка
operation
и params
(все хорошо)
есть еще идеи?
Редактировать
это моя текущая конфигурация DatabaseCleaner
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:deletion)
end
config.before do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :deletion
end
config.before do
DatabaseCleaner.start
end
config.after do
DatabaseCleaner.clean
end
end
Я еще не пытался изменить стратегию на :deleteion
, я тоже сделаю это