отключение фикстуры транзакций в Rspec не имеет никакого эффекта

Из-за устаревшей базы данных, которую я использую, я застрял в MySQL, использующем MyISAM, а это значит, что мои таблицы не поддерживают транзакции. Это приводит к сбою тестов, поскольку данные таблицы, созданные тестами (я использую factory_girl для фикстур), не восстанавливаются для каждого сценария.

Я обнаружил, что Rspec предоставляет настройку конфигурации config.use_transactional_fixtures в spec_helper.rb.

для которого по умолчанию установлено значение true. Когда я устанавливаю его на false, я не вижу никакого эффекта на мои тесты; они по-прежнему терпят неудачу из-за дублирования записей.

Разве этот параметр не должен автоматически разворачивать любые изменения, внесенные в БД? Или я должен делать это вручную?


person Dia Kharrat    schedule 05.01.2011    source источник


Ответы (1)


Вы правы - если ваша база данных не поддерживает транзакции, вы должны выполнить несколько команд SQL для удаления данных перед каждым оператором:

TRUNCATE TABLE tablename;

По одному на каждый из ваших столов.

В вашем helper.rb попробуйте следующее:

Spec::Runner.configure do |config|
  config.before(:each) do
    tables = %{users posts tags}
    tables.each do |t|
      ActiveRecord::Base.connection.execute('TRUNCATE TABLE #{t}')
    end
  end
  ... 
end 
person stef    schedule 05.01.2011
comment
Хорошо, спасибо; У меня создалось впечатление, что Rails как-то автоматизирует это. - person Dia Kharrat; 06.01.2011