【问题标题】:Clean test database, only of the data generated running the tests with RSPEC and Capybara清理测试数据库,仅生成使用 RSPEC 和 Capybara 运行测试的数据
【发布时间】:2017-12-18 21:39:53
【问题描述】:

我在 rails 4.1 中有一个应用程序,我正在使用 RSPEC 和 Capybara 对其进行测试,对于她我有一个测试数据库,其中包含用于执行测试的数据,我正在运行生成一些存储在 bd 中的数据的测试,或者我需要的是在运行测试后这些数据不存储在其中。

我使用了 gem database_cleaner(干净的测试数据库,仅使用 RSPEC 和 Capybara 运行测试生成的数据),但这会清除测试 bd 的所有数据,我只想擦除由测试。

我有这个配置,测试是javascrpit测试:

config.use_transactional_fixtures = false
    config.before(:suite) do
        if config.use_transactional_fixtures?
             raise(<<-MSG)
             Delete line `config.use_transactional_fixtures = true` from rails_helper.rb
             (or set it to false) to prevent uncommitted transactions being used in
             JavaScript-dependent specs.

             During testing, the app-under-test that the browser driver connects to
        uses a different database connection to the database connection used by
            the spec. The app's database connection would not be able to access
            uncommitted transaction data setup over the spec's database connection.
            MSG
        end
    DatabaseCleaner.clean_with(:truncation)
end

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

    config.before(:each, type: :feature) do
        driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test

        if !driver_shares_db_connection_with_specs
            DatabaseCleaner.strategy = :truncation
    end
end

【问题讨论】:

  • 很难理解为什么您不希望数据库在您运行的每个测试中都处于干净状态 - 在测试数据库中保存数据的目的是什么 - 您能否澄清一下您的使用案例?

标签: ruby-on-rails ruby rspec capybara rspec-rails


【解决方案1】:

如果您要在包含要保存在测试中的数据的表中创建记录,那么就没有简单的方法(对 database_cleaner 进行简单的配置更改等)来做您想做的事 - 维护开始时存在的数据考试。那是因为那将是 database_cleaner 的事务模式,它与 Rails 4.1 中的 Capybara 和 JS 测试不兼容(在 Rails 5.1 中,事务模式是兼容的,并且大多数配置不再需要 database_cleaner)

如果您没有在要从测试中保存的表中创建/删除/更新记录,那么您可以告诉 database_cleaner 跳过这些表。

既然做你想做的事并不容易,你应该问问自己为什么要尝试做大多数其他人没有做的事情,也许要调整你做事的方式。

如果您仍想继续您正在尝试做的事情(并且您没有修改测试中的任何现有数据(只是添加新行),那么您需要创建一个 before 挂钩来存储每个表中的最大 id,然后是一个 after 钩子,用于删除具有较大 id 的记录,并且不使用 database_cleaner

【讨论】:

  • 感谢您的回答,这很有帮助您告诉我这不是做我想做的事情的正确方法,您能告诉我正确的方法是什么吗?
  • @Andres23Ramirez 通常,功能测试是通过在测试开始时仅设置特定测试所需的记录来完成的。这样,每个测试都与其他测试完全隔离。你可能有一个很好的理由不这样做,但是没有更多的细节/例子来说明你为什么要在所有测试之前用一堆数据预先填充你的测试数据库,这很难说。
【解决方案2】:

你可以用这个

rake db:reset RAILS_ENV=test

【讨论】:

  • 这会重置测试的 bd,我需要的是在 bd 中不保存任何数据,以便其他测试用例不受影响,而是来自相同的执行
  • 您可以尝试使用database_cleaner
  • 并使用:truncation 选项
  • 我不需要命令,如果不是 rspec 和 Capybara 的适当配置形式在每次测试后返回数据但不删除所有 bd
  • @ChetanDatta 我认为他已经在使用 database_cleaner 和截断选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
相关资源
最近更新 更多