У меня есть приложение Rails 3. Я использую обратные вызовы after_save для некоторых моделей и обратные вызовы after_commit для одной из моделей. Весь код работает нормально, но во время тестов RSpec обратный вызов after_commit не вызывается, когда я сохраняю модель Thing
.
e.g.
class ThingObserver < ActiveRecord:Observer
observe Thing
def after_commit(thing)
puts thing.inspect
end
end
Если я изменю имя метода на after_save
, он будет нормально вызываться во время тестов. Мне нужно иметь возможность использовать after_commit
для этой конкретной модели, потому что в некоторых ситуациях изменение «вещи» происходит на веб-сервере, но эффект наблюдателя происходит в работнике Sidekiq, и after_save
не гарантирует, что данные было совершено и доступно, когда рабочий готов к этому.
Конфигурация для RSpec выглядит так в spec / spec_helper.rb
Rspec.configure do |config|
#yada yada
config.use_transactional_fixtures = true
#yada yada
end
Я также скорректировал rake db:create
так, чтобы он извлекался из файла structure.sql. В lib / tasks / db.rb
task setup: [ 'test:ensure_environment_is_test', 'db:create', 'db:structure:load', 'db:migrate', 'db:seed' ]
Я сделал это, чтобы запустить тесты, чтобы убедиться, что база данных применяет ограничения внешнего ключа.
Есть ли способ запустить как обратные вызовы after_save, так и after_commit, не делая Rspec use_transactional_fixtures == false?
Или есть способ установить config.use_transactional_fixtures в 'false' только для этого теста или для этого тестового файла?