千家信息网

Rspec中怎么清理陈旧数据

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章将为大家详细讲解有关Rspec中怎么清理陈旧数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Rails Rspec后台默认事务如果使用rai
千家信息网最后更新 2026年11月04日Rspec中怎么清理陈旧数据

这篇文章将为大家详细讲解有关Rspec中怎么清理陈旧数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Rails Rspec后台默认事务

如果使用rails-rspec,默认情况下,spec/rails_helper.rb中会启用以下配置:

RSpec.configuredo |config|                   config.use_transactional_fixtures=true                 end

这意味着"在事务内运行每个示例",即在示例结束时,所有数据库的变更都将回滚。

如何让"事务装置"实现"在事务内运行每个示例"?

在深入研究Rails 4代码库,了解了它在后台的实际工作之后,我发现了以下内容。setup_fixtures函数中,Rails为每个数据库连接调用begin_transaction。

Rails 4的setup_fixtures

在teardown_fixtures函数中,Rails为每个数据库连接调用rollback_transaction。

Rails 4的teardown_fixtures

这也意味着,如果在应用程序中使用多个数据库,那么应用程序将为所有数据库创建事务。

在示例之外创建的数据库记录将不会回滚

由于数据库事务围绕着每个示例,因此在示例范围之外创建的任何数据库记录都不会回滚,也就是说,在before(:all)、before(:context)或before(:suite)代码块中创建的任何数据库记录都不会回滚。

这可能导致示例组之间而不是同一组的示例之间的竞态条件,因此处理hook问题时要十分小心。

context'context 1'do           before(:context) do             create(:user) # WON'T BE ROLLED-BACK           end                beforedo             create(:user) # will be rolled-back           end                # ...         end              context'context 2'do           before(:context) do             create(:user) # WON'T BE ROLLED-BACK           end                # ...         end              # BY NOW, THERE ARE 2 USER RECORDS COMMITED TO DATABASE

手动设置数据库事务

你还可以选择使用hook手动设置数据库事务。

RSpec.configuredo |config|                   config.use_transactional_fixtures=false# DISABLE DEFAULT TRANSACTIONS                 end              before(:example) do                   ActiveRecord::Base.connection.begin_transaction                 end              after(:example) do                   conn =ActiveRecord::Base.connection                   conn.rollback_transactionif conn.transaction_open?                 end              # OR              around(:example) do |example|                   ActiveRecord::Base.transactiondo                     example.run                            # ROLLBACK after the example finishes.                     # This exception is silently swallowed by ActiveRecord.                     raiseActiveRecord::Rollback                   end                 end

[Rails 4 & Rails 5.0.x]数据库事务是按线程执行的

Rails 4中的数据库连接

由上可知,ActiveRecord数据库连接是按线程执行的。因此,Rails通过use_transactional_fixtures管理的默认数据库事务只在主线程中可用。

从技术上说,根据事务回滚策略,一个线程的数据库记录将独立于其他线程。需要访问其他线程中的某个线程的数据库数据时请注意这一点,例如Selenium。

[Rails 4 & Rails 5.0.x]JavaScript驱动程序(Selenium)和Capybara Webkit的验收测试问题。

Selenium在另一个线程上运行,因此它不能与运行RSpec的主线程共享事务。为了让客户端应用程序访问数据库中的数据,RSpec需要将改动提交。这类情况下可以允许提交数据,然后手动清理数据。

[Rails 4 & Rails 5.0.x]DatabaseCleaner——回滚策略

要解决上述问题,首先需要禁用Rails派生的事务,将config.use_transactional_fixtures设置为false,或干脆删除它。DatabaseCleaner是一个gem,它提供了清理数据库的高级策略,例如删节、事务处理或删除。

下面是利用DatabaseCleaner处理上述JS驱动程序问题的著名gist:


[从Rails 5.1起]数据库事务在测试线程之间共享

线程之间的共享数据库事务由Rails团队的Eileen完成,并作为Rails 5.1的一部分内容发布。

加入了lock_thread

为测试启用了lock_thread

关于Rspec中怎么清理陈旧数据就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

数据 数据库 事务 线程 示例 程序 之间 内容 问题 运行 应用程序 手动 策略 处理 应用 测试 陈旧 代码 函数 后台 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技 江苏根荣互联网科技 为想互联网科技怎么样 互联网科技公司华为 互联网科技官网 互联网科技股票 宜安科技 互联网金融 融贸通互联网科技 广西拼得多互联网科技有限公司 互联网公司会议桌创意科技软装饰 成都互联网科技公司100强 常德市电业局互联网科技部 中化能源互联网科技招聘 互联网经济与金融科技 互联网科技与大数据专业 佛山市拉法互联网科技有限公司 长沙茂晟互联网科技有限公司 互联网相关科技技术 互联网科技平台产品运营 保山互联网科技靠谱吗 卓越科技互联网 招聘 米聚互联网科技南京有限公司排面 互联网科技公司营业执照怎么办理 皮皮虾互联网科技有限公司 陕西云淼互联网科技公司 张家口科技产业互联网平台 杭州融税互联网科技有限公司 互联网科技对化妆品行业 互联网科技创新方面的资料 互联网科技自媒体灵感
0