Database_Cleaner Уничтожение записей между HTTP-запросами в середине спецификации - PullRequest
4 голосов
/ 20 февраля 2012

Я запускаю спецификации интеграции с использованием Rspec и Capybara и очищаю записи между спецификациями с помощью Database Cleaner. Если это имеет значение, я запускаю свои спецификации автоматически, используя Guard и Spork.

Каким-то образом во время выполнения теста записи удаляются из базы данных, что приводит к сбою. Я неправильно настроил Datbase Cleaner? Или я что-то не так делаю? Я уже видел этот пост , но я не думаю, что это моя проблема.

Любая помощь будет оценена!

Вот spec_helper.rb

Spork.prefork do
  # ...    
  RSpec.configure do |config|
    config.mock_with :rspec
    config.use_transactional_fixtures = true
    config.include(MailerMacros)

    config.treat_symbols_as_metadata_keys_with_true_values = true
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true

    config.before(:suite) { DatabaseCleaner.strategy = :truncation }
    config.before(:each) { DatabaseCleaner.start }
    config.after(:each) { DatabaseCleaner.clean }
  end

end

Spork.each_run do
  FactoryGirl.reload
end

А вот моя спецификация: (обратите внимание на операторы с двумя путями)

feature "Claim Firm" do
  let(:firm) { Factory(:firm, :user_id => nil) }

  scenario "The details page should show a 'Claim' link", :focus => true do
    email = 'claimer@foo.com'
    password = 'secretpass123'
    u = Factory(:user, :email => email, :password => password, :name => "Bob Claimer")
    puts "User Count: #{User.count}" # ==> 1
    visit login_path
    puts "User Count: #{User.count}" # ==> 0
    # The rest of the spec fails because there are no user records...
  end
end

1 Ответ

1 голос
/ 22 февраля 2012

Не уверен, что является основной причиной, но стратегия усечения для SQLite - это оптимизация, которая в некоторых ситуациях выглядит странно, поэтому придерживайтесь: транзакции или: удаления, если они не слишком медленные.

...