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?

ценить какие-либо рекомендации / уроки?

мы пытались

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 фиксировать базу данных. На скорости стоимость.

Учитывая, что это замедляет тесты, и нам нужны только некоторые специальные тесты, теперь мы ищем решения для различных стратегий на основе флагов / атрибутов.

Другие вопросы по тегам