清理测试数据库,仅使用RSPEC和Capybara生成的测试数据

时间:2017-12-18 21:39:53

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

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

2 个答案:

答案 0 :(得分:1)

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

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

既然要做你想做的事情并不容易,你应该问问自己,为什么你要尝试做其他人不能做的事情,也许要调整你做的事情。的东西。

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

答案 1 :(得分:0)

您可以使用此

rake db:reset RAILS_ENV=test
相关问题