Rails 在测试之间清理数据库不起作用

Rails clean database between tests not work

我是 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 不清理我的数据库?我做错了什么?我花了一天时间寻找解决方案,但一无所获。 请帮助我。

P.S。这是一个培训项目。

我的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

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

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

接下来,您的数据库清理器配置应该更像推荐的配置 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。 append_after vs after 对于稳定性很重要,检查驱动程序名称 vs 只是 :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')