【问题标题】:Rails clean database between tests not work测试之间的 Rails 清理数据库不起作用
【发布时间】:2017-02-25 18:23:01
【问题描述】:

我是 Rails 新手。在我的项目中,我使用 rspec + capybara + poltergeist + selenium + database_cleaner。

源码github link

我有 postgresql 9.5.5,ubuntu 16.04 LTS。

运行测试时

rspec spec/controllers # everything work fine

运行时

rspec spec/features # everything work fine too

但是当我运行所有测试时

rspec # part of tests fail

在浏览器 28 中使用 :selenium -> question_id 运行第一次验收测试时,但必须为 1,因为它使用 database_cleaner。

为什么 database_cleaner 不清理我的数据库?我做错了什么?我花了一天时间寻找解决方案,但一无所获。 请帮帮我。

附:这是一个培训项目。

我的 Database_Cleaner 配置是:

  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

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

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
    Warden.test_reset!
    if Rails.env.test?
      FileUtils.rm_rf(Dir["#{Rails.root}/public/uploads"])
    end
  end

【问题讨论】:

  • 为什么你认为 in 必须是 1 ?根据您设置 database_cleaner 的方式,数据库可能为空但不重置 id 列计数器 - 您是否查询数据库以查看其中保存了多少问题?您的测试中不应包含任何硬编码的记录 ID。如果这不是问题,那么将您的一项测试和您的 database_cleaner 配置添加到您的问题中。
  • 我将文件添加到问题中。默认情况下,我认为 db 中的问题是一个,并且添加文件的链接必须具有链接 href:'/uploads/attachment/file/1/test_file.dat',其中 1 是问题 ID。但实际上问题 id 是 28。我认为每次测试运行时数据库清理器都会清理表。
  • @ThomasWalpole - 我明白你在说什么。是的,表只有 1 行。我需要重写我的测试。谢谢你的解决方案。
  • 好的——我看错了分支——我看到你现在正在谈论的测试——更新我的答案

标签: ruby-on-rails selenium capybara poltergeist database-cleaner


【解决方案1】:

清理表意味着它会删除所有记录,并不一定意味着它会重置索引计数器 - 就像您删除记录 3 然后添加新记录一样 - 新记录将是 4。所以在您的情况下可能有 27 条记录已被删除,而您创建的下一条记录将是 28 条,即使只有 1 条实际记录。查询数据库以查看有多少实际记录可以验证。

接下来,您的数据库清理器配置应该更像推荐的配置 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。 append_after vs after 对于稳定性和检查驱动程序名称与仅检查 :js 元数据很重要。

在您的测试中检查 href '/uploads/attachment/file/1/test_file.dat' 时,您不应该检查硬编码的“1”,您应该根据记录的记录 ID 号进行检查你创造的。所以“/uploads/attachment/file/#{question.id}/test_file.dat”(显然question.id 将取决于您创建的对象和变量名,但我认为这至少与您的一项测试相匹配.

此外,在快速查看您的规格后 - 您在任何地方做 expect(current_path).to eq ... 都是错误的。你应该做expect(page).to have_current_path(...)。第一种方式会禁用 Capybara 的重试行为,并会导致不稳定的测试。

最后 - 你有expect(page).not_to have_content t('common.button.ready'),我猜应该是expect(page).not_to have_button t('common.button.ready')

【讨论】:

  • 感谢您的详细解答。
【解决方案2】:

在这里您可以阅读如何使用RSpecCapybara 配置database_cleaner - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多