网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

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。

Rspec中怎么清理陈旧数据
Rails 4的setup_fixtures

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

Rspec中怎么清理陈旧数据
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]数据库事务是按线程执行的

Rspec中怎么清理陈旧数据
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:

Rspec中怎么清理陈旧数据

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

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

Rspec中怎么清理陈旧数据
加入了lock_thread
Rspec中怎么清理陈旧数据
为测试启用了lock_thread

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


当前标题:Rspec中怎么清理陈旧数据
本文网址:http://bjjierui.cn/article/jegocs.html

其他资讯