即使使用以下选项,数据库清理程序也会清除所有表

时间:2011-06-08 08:15:25

标签: ruby-on-rails cucumber capybara

我在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,这也无效。

3 个答案:

答案 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