如何清理黄瓜栏中不同功能之间的数据库?

时间:2018-03-23 13:21:33

标签: ruby-on-rails cucumber database-cleaner

我无法在功能之间清理数据库。 我尝试使用Before钩子,但是它针对每个场景运行,但我只需要在每个功能的开头清理数据库,而不是在场景之间清理。

任何建议都会有所帮助。

5 个答案:

答案 0 :(得分:0)

我使用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

答案 1 :(得分:0)

以下是示例配置

before(:all) do
  DatabaseCleaner.clean   
end

在RSpec中,你有标签,类型,钩子等。 在您的情况下,最简单的方法是在每个文件中添加before(: all)。 这将在所描述的上下文中的所有测试之前开始清洁。

来自文档Rspec Docs

  

之前(:所有)块在组

中的所有示例之前运行一次

答案 2 :(得分:0)

应该在每个场景之前清理数据库,因为Cucumber打算这样做。阻止黄瓜这样做是一种错误的优化,一种常见的反模式,随后是许多经验较少的黄瓜用户。场景永远不应该相互依赖。

要使其正常工作,请删除您添加到应用程序中的所有代码,以限制黄瓜清理数据库的方式。

如果您不确定如何操作,请使用您正在使用的相同ruby和rails版本创建一个新的rails项目,然后添加cucumber-rails gem。它将按预期设置一切。您可以使用之前/之后的diff-rails进行比较。

答案 3 :(得分:0)

您可以使用以下代码在每个方案的之前(不是之后)清理数据库。只需将其添加到您的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

答案 4 :(得分:0)

只是变通/破解,以防万一您尚未找到解决方案。 这里的技巧是使用标记的黄瓜钩子!

在功能文件的最后一个方案中提供@LastScenario之类的标签。 然后使用黄瓜的@After钩子执行操作,说根据您的情况清除数据。 就像是:     @LastScenario     方案:我的方案名称     鉴于我有东西...

然后在Hooks.java类中:

public class Hooks {

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

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

}

也可以根据需要使用@Before Hook进行相同操作。