我在功能之间清理数据库时遇到了麻烦。我尝试使用Before钩子,但它为每个场景运行,但我只需要在每个功能的开头清理数据库,而不是在场景之间。
任何的意见都将会有帮助。
我使用DatabaseCleaner qazxsw poi我很满意
https://github.com/DatabaseCleaner/database_cleaner
在rails_helper.rb中
这是示例配置
config.before(:each) do |spec|
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.start
...
end
config.append_after(:each) do
DatabaseCleaner.clean
end
在RSpec中,你有标签,类型,钩子等。在你的情况下,最简单的方法是在每个文件中添加before(:all) do
DatabaseCleaner.clean
end
。这将在所述上下文中的所有测试之前开始清洁。
来自文档before(: all)
before(:all)块在组中的所有示例之前运行一次
应该在每个场景之前清理数据库,因为Cucumber打算这样做。阻止黄瓜这样做是一种错误的优化,一种常见的反模式,随后是许多经验较少的黄瓜用户。情景永远不应该相互依赖。
要使其工作,请删除已添加到应用程序的任何代码,以限制黄瓜清理数据库的方式。
如果您不确定如何操作,请使用您正在使用的相同ruby和rails版本创建一个新的rails项目,然后添加cucumber-rails gem。它将按预期设置一切。您可以使用之前/之后的diff-rails进行比较。
您可以使用以下代码在每个方案之前(而不是之后)清理数据库。只需将其添加到您的Rspec Docs
features/support/env.rb
只是一个解决方法/黑客,以防你还没有找到解决方案。这里的诀窍是使用标记黄瓜钩!
在特征文件中的最后一个场景中提供@LastScenario等标记。然后使用黄瓜的@After钩子执行操作,比如在你的情况下清理数据。类似于:@LastScenario场景:我的场景名称鉴于我有一些东西......
然后在Hooks.java类中:
Cucumber::Rails::Database.autorun_database_cleaner = false
DatabaseCleaner.strategy = :truncation
Cucumber::Rails::Database.javascript_strategy = :truncation
Before do
DatabaseCleaner.clean
end
同样可以使用@Before Hook完成 - 基于所需要的。