DatabaseCleaner.start, настроенный в Rspec.config.before, выполняется после блоков «до» тестирования: ошибки дублирования - PullRequest
0 голосов
/ 06 февраля 2019

DatabaseCleaner.start настроен в блоке Rspec.config.before(:each), но выполняется после «до» тестовых блоков, это приводит к ошибкам дублирования в тестах

У меня есть в rails_helper.rb

RSpec.configure do |config|
  ...
  config.before(:each) do
    puts 'database cleaner start'
    DatabaseCleaner.start
  end
  config.before(:each) do
    puts 'database cleaner clean'
    DatabaseCleaner.start
  end
  ...
end

в тесте:

  let(:account) { FactoryBot.create(:account) }

  before do
    puts "before test"
    # use of account => duplicated errors
  end

  scenario 'some example' do
    puts 'some expectations 1'
    ...
  end

  scenario 'some example' do
    puts 'some expectations 2'
    ...
  end

и результат равен

  • до теста

  • запуск очистителя базы данных

  • некоторые ожидания 1

  • очиститель базы данных clean

  • до испытания

  • запуск очистителя базы данных

  • некоторые ожидания 2

  • очиститель базы данных чистит

Это приводит к ошибкам дублирования в блоке before «некоторых ожиданий 2», поскольку «до проверки»использует account и, как я вижу, последний DatabaseCleaner.clean не очищается.

Есть способ инвертировать этот порядок?, так что нет необходимости добавлять sequences вFactoryBot

Я бы хотелsult

  • запуск очистителя базы данных

  • до теста

  • некоторые ожидания 1

  • очиститель базы данных чистится

  • запуск очистителя базы данных

  • до испытания

  • некоторые ожидания 2

  • очиститель базы данных очистить

Возможное решение - изменить стратегию:

  config.before(:each, type: :feature) do
    DatabaseCleaner.strategy = :truncation
  end

но

  • Как говорится документация , transaction стратегиябыстрее

  • Я не могу понять, почему с transaction не работает стратегия, на самом деле не удаляются данные?

  • Концептуально,Я предпочел бы очистить данные, прежде чем делать что-либо

...