Интеграционный тест Rspec не очищает базу данных - PullRequest
5 голосов
/ 10 апреля 2011

База данных не очищается после каждого интеграционного теста.Значение остается в базе данных.

Есть ли вариант, который мне нужно сделать, чтобы это произошло?

Спасибо

Ответы [ 6 ]

12 голосов
/ 10 апреля 2011

Я думаю https://github.com/bmabey/database_cleaner - это то, что вам нужно.

4 голосов
/ 20 октября 2016

Для тех, кто использует before(:all) ловушки, имейте в виду, что эти ловушки выполняются до того, как транзакция, связанная с прибором, будет открыта.Это означает, что любые данные, созданные хуками before (: all), не будут откатываться транзакционными устройствами .Вы можете прочитать больше в документации RSpec .

Я просто хотел упомянуть об этом, потому что меня это укусило, и мой первоначальный инстинкт был в том, чтобы перейти к Database Cleaner (который не нужен)и в итоге не работает).

2 голосов
/ 04 августа 2013

Как подготовить тестовые базы данных для тестов Rails rspec без запуска rake spec?

Мой ответ может вас заинтересовать.это хорошее решение.В вашем случае вам, вероятно, понадобится что-то вроде

config.after :each do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end
2 голосов
/ 29 июня 2013

Вам нужен DatabaseCleaner, но вы можете обнаружить, что стратегия :truncation слишком медленная, чтобы работать все время.Это действительно необходимо только для интеграционных тестов, поэтому вы можете сделать это:

# spec/spec_helper.rb
require 'database_cleaner'
config.before(:suite) do
  DatabaseCleaner.clean_with :truncation
  DatabaseCleaner.strategy = :transaction
end

config.before(:each) do |group|
  # The strategy needs to be set before we call DatabaseCleaner.start
  case group.example.metadata[:type]
  when :feature
    DatabaseCleaner.strategy = :truncation
  else
    DatabaseCleaner.strategy = :transaction
  end
  DatabaseCleaner.start
end

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

# spec/features/your_feature_spec.rb
require 'spec_helper'
describe "An integration test", :type => :feature do
end

# spec/model/your_model_spec.rb
require 'spec_helper'
describe "A unit test" do
end

Очевидно, это применимо, только если вы проводите интеграционные тесты с RSpec напрямую, а не с Cucumber.

2 голосов
/ 10 апреля 2011

Ищите здесь учебник: http://railscasts.com/episodes/257-request-specs-and-capybara

Он описывает Очиститель базы данных, кроме Rspec и Capybara

0 голосов
/ 01 июня 2016

Есть два способа сделать это:

  1. Настройка примеров транзакций для каждого отдельного теста.
  2. Настройка примеров транзакций для всех тестов.

Если вы выберете вариант 1: вверху спецификации, после:

require 'spec_helper'

Добавить:

RSpec.configure {|c| c.use_transactional_examples = true }

Откат транзакций после каждого примера.

2.Если вы хотите настроить его глобально, то в spec_helper.rb

RSpec.configure do |config|
...
config.use_transactional_examples = true # Add this
...
end
...