rails ActiveRecord Транзакционная целостность / данные не фиксируются в середине сценария?
Я знаю, что неправильно понимаю, как ActiveRecord поддерживает целостность / работает: надеясь, что кто-то сможет объяснить мне, объясняя, почему следующее не работает?
У нас ненормальная ситуация: наше приложение rails вызывает скомпилированный двоичный файл, который обращается (и создает новые строки таблицы, но не обновляет существующие) в общей базе данных. Поэтому мы запускаем config.use_transactional_fixtures = false в rails_helper (в противном случае мы получаем ошибки точки сохранения). Данные должны быть зафиксированы в сценарии, чтобы это устаревшее приложение могло получить доступ к данным в базе данных во время теста.
Во время теста мы настраиваем данные с помощью eval(rubyexpression) (полный код см. Ниже)
"provider = Provider.create({:provider_reseller_phone_number => '0200000000', :provider_registered_business_name => 'ProviderReseller', :provider_name => 'providerwithzero'})"
НОТА:
- я знаю, что мы должны использовать factorygirl для этого, это другая длинная история
- нет никакого дополнительного кода модели провайдера, например, обратные вызовы, хуки
При использовании отладчика для приостановки теста (строка 22) данные не сохраняются в базе данных, но находятся там после завершения rspec.
Мы не можем понять, почему!? данные обязательно передаются после каждой транзакции, например, eval?
ценить какие-либо рекомендации / уроки?
мы пытались
- используя new + "save" в переменной провайдера, но он не заполняется eval.
- config.use_transactional_fixtures = true, но это нарушает нашу другую потребность, например, внешний процесс обращается к БД
- поиск путей сброса (но, похоже, относится только к "транзакциям")
- попытался найти способы совершения "save_points" (не повезло)
- provider.create!
- основан на () Rails 3: наблюдатель ActiveRecord: обратный вызов after_commit не срабатывает во время тестов, но after_save запускает run_callbacks (: commit)
spec_test_eval.rb
require 'rails_helper'
describe 'trying to test using rails populated data for external process' do
it 'populates provider and tests external process' do
initial_data = "provider = Provider.create({:provider_reseller_phone_number => '0200000000', :provider_registered_business_name => 'ProviderReseller', :provider_name => 'providerwithzero'})"
eval(initial_data)
debugger
expect Provider.all.count.eql?(1)
# using mysql to check providers table its empty
exec_path_str = "#{EXTERNALPROCESS} 1 1"
stdop_content = `#{exec_path_str}`
end
end
вывод test.log
ActiveRecord::SchemaMigration Load (0.2ms) SELECT `schema_migrations`.* FROM `schema_migrations`
(0.1ms) BEGIN
(0.1ms) SAVEPOINT active_record_1
SQL (0.2ms) INSERT INTO `providers` (`created_at`, `provider_name`, `provider_registered_business_name`, `provider_reseller_phone_number`, `updated_at`) VALUES ('2014-12-27 03:33:21', 'providerwithzero', 'ProviderReseller', '0200000000', '2014-12-27 03:33:21')
(0.1ms) RELEASE SAVEPOINT active_record_1
(0.2ms) SELECT COUNT(*) FROM `providers`
(0.4ms) ROLLBACK
1 ответ
Таким образом, кажется, что это самоцвет DatabaseCleaner, вызывающий такое поведение.
Поняв различия между усечениями, транзакциями и т. Д. (Для стратегий очистки базы данных у нас была включена транзакция, которая заставляет окружающую транзакцию и откат. Но с использованием DatabaseCleaner.strategy =:truncation) позволяет каждому действию ActiveRecord фиксировать базу данных. На скорости стоимость.
Учитывая, что это замедляет тесты, и нам нужны только некоторые специальные тесты, теперь мы ищем решения для различных стратегий на основе флагов / атрибутов.