我在rails项目上遇到数据库清理问题。我在我的测试环境中使用了一个sqlite3数据库,它有许多包含参考数据的表,由db:test:prepare任务填充,不需要在测试之间擦除。
我有很多使用webdriver驱动程序标记@javascript的黄瓜方案,还有一些没有标记的黄瓜方案。
在我的env.rb文件中,我已将数据库清理程序配置为使用截断策略,并使用except选项:
DatabaseCleaner.strategy = :truncation, {:except => %w[ignore me]}
在每个场景之后调用 DatabaseCleaner.clean
,并在javascript标记的场景中按预期工作。
但是,对于非JavaScript场景,它会截断整个数据库,包括:except数组中列出的表。我也尝试过调用DatabaseCleaner.clean_with
,这也无效。
答案 0 :(得分:8)
我遇到了与 PostgreSQL 和 database_cleaner(1.4.0)类似的问题。 尽管:except 选项:
,但此代码无法正常工作并被截断DatabaseCleaner.clean_with(:truncation, :except => %w[countries] )
我发现你必须提供全表名才能使其与PostgreSQL一起工作。以下代码按预期工作:
DatabaseCleaner.clean_with(:truncation, :except => %w[public.countries] )
更新:似乎在 database_cleaner 版本1.4.1中已修复此问题,并且按预期方式在那里工作
答案 1 :(得分:7)
我遇到了类似的错误,除了我在运行@javascript场景时遇到问题。
经过大量的谷歌搜索,阅读和拉头后,我遇到了this post
我查看了那里提到的database_cleaner钩子文件( cucumber-rails-0.4.0 / lib / cucumber / rails / hooks / database_cleaner.rb )并且看得出它设置了database_cleaner策略:在每个场景之前使用以下标记截断无异常:@no-txn,@ selenium,@ culerity,@ celerity,@ javascript。
Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
DatabaseCleaner.strategy = :truncation
end
我将before语句复制并粘贴到我的黄瓜env.rb文件中,并将my:except语句添加到其中。这似乎解决了这个问题。
您确定不是导致问题的@javascript场景吗?
答案 2 :(得分:2)
对于最新的Rails版本> = 6和database_cleaner(v1.8.5),我们不需要为表使用公共前缀。您可以在rails_helper.rb中添加以下内容:
tables_to_be_excluded = %w[user_types]
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation, {except: tables_to_be_excluded})
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end