2011-02-01 3 views
4

Я запускаю рельсы 3.0.3 и используя rspec-rails 2.4.1 с базой данных postgresql. Всякий раз, когда я запускаю свои тесты RSpec, данные остаются в конце. Кто-нибудь знает, как получить рельсы или rspec, чтобы стереть данные тестовой среды между каждым использованием?rails test database не будет протирать

Скажите, пожалуйста, если есть какая-либо дополнительная информация, которая могла бы облегчить ответ на мой вопрос.

Спасибо!
Tristan

+0

Я считаю, что данные очищаются, прежде чем запускать тесты, а не после. – cam

+0

Хей Cam. Извините, это, вероятно, правильно, но сейчас и не происходит. – WoodenKitty

ответ

10

Установите драгоценный камень database_cleaner, а затем добавьте его в свой spec_helper.rb.

Spec::Runner.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

end 
+0

Привет, спасибо Бобби. Разве тестовая база данных не запускается пустым каждый раз, когда вы запускаете rspec по умолчанию? – WoodenKitty

+0

Эй, Тристан, должно быть, но есть странные случаи, когда данные задерживаются между тестами. Я также считаю, что если вы используете 'rake' для вызова своих спецификаций, он будет запускать' db: test: prepare' перед вашими спецификациями. – bobbywilson0

5

Используйте транзакционные примеры откатить данные после каждого теста

RSpec.configure do |config| 
    config.use_transactional_examples = true 
end 
+0

Hi Deepak. У меня уже есть этот набор в моем файле spec_helper, и мои скрипты rspec «требуют» spec_helper. – WoodenKitty

+0

Я получаю 'undefined method 'use_transactional_examples ='' в rspec 2.8.0. У этого метода есть новое имя? –

+1

Да. его теперь 'use_transactional_fixtures' –

0

Другая возможность, что я просто ставлю себя через, использует неправильный before блок.

я случайно установил before блок как all вместо each:

before :all do 
    user = FactoryGirl.create(:user) 
    sign_in user 
end 

Это вызвало user, чтобы остаться в базе данных для всего rspec пробега, что вызвало столкновение проверки.

Вместо этого before должен быть each так, что все держится в чистоте через rspec перспективы:

before :each do 
    user = FactoryGirl.create(:user) 
    sign_in user 
end 

Если вы сделали эту ошибку, то вам, вероятно, придется вручную очистить вашу базу данных теста прежде чем все вернется к норме. Самый простой способ сделать это - это, вероятно, усечение каждой из таблиц (кроме schema_migrations).

0

Вам не нужен какой-либо дополнительный камень для очистки тестовой БД между прогонами. В вашем файле spec_helper.rb настройте rspec следующим образом:

RSpec.configure do |c| 
    c.around(:each) do |example| 
    ActiveRecord::Base.connection.transaction do 
     example.run 
     raise ActiveRecord::Rollback 
    end 
    end 
end