Как почистить базу данных между различными функциями огурцов?

У меня проблемы с очисткой базы данных между функциями. Я попытался использовать ловушки Before, но он работает для каждого сценария, но мне нужно очищать базу данных только в начале каждой функции, а не между сценариями.

Любые предложения будут полезны.

4 ответа

Я использую DatabaseCleaner https://github.com/DatabaseCleaner/database_cleaner Я доволен

  config.before(:each) do |spec|
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.start
    ...
  end

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

в rails_herper.rb

Вот пример конфигурации

before(:all) do
  DatabaseCleaner.clean   
end

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

Из документации Rspec Docs

before (: все) блоки запускаются один раз перед всеми примерами в группе

Просто обойти / взломать, на случай, если вы еще не нашли решение. Хитрость здесь в том, чтобы использовать помеченные огурцы крючки!

Добавьте тег типа @LastScenario в ваш последний сценарий в файле (-ах) объектов. Затем с помощью ловушки @After cucumber выполните действие, скажем, очистка данных в вашем случае. Что-то вроде: @LastScenario Scenario: Имя моего сценария Учитывая, что у меня есть что-то...

А затем в классе Hooks.java:

public class Hooks {

@After("@LastScenario")
public void dataCleanUp() {

    CleanUpScripts cleanUpScripts = new CleanUpScripts();
    cleanUpScripts.dataCleanUp();
}

}

То же самое можно сделать с помощью @Before Hook - в зависимости от того, что требуется.

Вы можете очистить базу данных до (не после) каждого сценария с помощью следующего кода. Просто добавьте его в свой features/support/env.rb

Cucumber::Rails::Database.autorun_database_cleaner = false
DatabaseCleaner.strategy = :truncation
Cucumber::Rails::Database.javascript_strategy = :truncation

Before do
  DatabaseCleaner.clean
end

База данных должна быть очищена перед каждым сценарием, как намеревается Cucumber. Отключение Cucumber от этого - ложная оптимизация и распространенный анти-паттерн, за которым следует множество менее опытных пользователей Cucumber. Сценарии никогда не должны зависеть друг от друга.

Чтобы заставить это работать, удалите любой код, который вы добавили в свое приложение, чтобы ограничить, как огурец очищает базу данных.

Если вы не уверены, как это сделать, создайте новый проект rails, используя те же версии ruby ​​и rails, которые вы используете, а затем добавьте гем cucumber-rails. Это настроит все, как задумано. Вы можете использовать разницу до / после огурцов-рельсов для сравнения.

Другие вопросы по тегам