溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Rspec中怎么清理陳舊數(shù)據(jù)

發(fā)布時(shí)間:2021-07-24 16:06:15 來(lái)源:億速云 閱讀:116 作者:Leah 欄目:數(shù)據(jù)庫(kù)

這篇文章將為大家詳細(xì)講解有關(guān)Rspec中怎么清理陳舊數(shù)據(jù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

Rails Rspec后臺(tái)默認(rèn)事務(wù)

如果使用rails-rspec,默認(rèn)情況下,spec/rails_helper.rb中會(huì)啟用以下配置:

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

這意味著“在事務(wù)內(nèi)運(yùn)行每個(gè)示例”,即在示例結(jié)束時(shí),所有數(shù)據(jù)庫(kù)的變更都將回滾。

如何讓“事務(wù)裝置”實(shí)現(xiàn)“在事務(wù)內(nèi)運(yùn)行每個(gè)示例”?

在深入研究Rails  4代碼庫(kù),了解了它在后臺(tái)的實(shí)際工作之后,我發(fā)現(xiàn)了以下內(nèi)容。setup_fixtures函數(shù)中,Rails為每個(gè)數(shù)據(jù)庫(kù)連接調(diào)用begin_transaction。

Rspec中怎么清理陳舊數(shù)據(jù)
Rails 4的setup_fixtures

在teardown_fixtures函數(shù)中,Rails為每個(gè)數(shù)據(jù)庫(kù)連接調(diào)用rollback_transaction。

Rspec中怎么清理陳舊數(shù)據(jù)
Rails 4的teardown_fixtures

這也意味著,如果在應(yīng)用程序中使用多個(gè)數(shù)據(jù)庫(kù),那么應(yīng)用程序?qū)樗袛?shù)據(jù)庫(kù)創(chuàng)建事務(wù)。

在示例之外創(chuàng)建的數(shù)據(jù)庫(kù)記錄將不會(huì)回滾

由于數(shù)據(jù)庫(kù)事務(wù)圍繞著每個(gè)示例,因此在示例范圍之外創(chuàng)建的任何數(shù)據(jù)庫(kù)記錄都不會(huì)回滾,也就是說(shuō),在before(:all)、before(:context)或before(:suite)代碼塊中創(chuàng)建的任何數(shù)據(jù)庫(kù)記錄都不會(huì)回滾。

這可能導(dǎo)致示例組之間而不是同一組的示例之間的競(jìng)態(tài)條件,因此處理hook問(wèn)題時(shí)要十分小心。

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

手動(dòng)設(shè)置數(shù)據(jù)庫(kù)事務(wù)

你還可以選擇使用hook手動(dòng)設(shè)置數(shù)據(jù)庫(kù)事務(wù)。

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]數(shù)據(jù)庫(kù)事務(wù)是按線程執(zhí)行的

Rspec中怎么清理陳舊數(shù)據(jù)
Rails 4中的數(shù)據(jù)庫(kù)連接

由上可知,ActiveRecord數(shù)據(jù)庫(kù)連接是按線程執(zhí)行的。因此,Rails通過(guò)use_transactional_fixtures管理的默認(rèn)數(shù)據(jù)庫(kù)事務(wù)只在主線程中可用。

從技術(shù)上說(shuō),根據(jù)事務(wù)回滾策略,一個(gè)線程的數(shù)據(jù)庫(kù)記錄將獨(dú)立于其他線程。需要訪問(wèn)其他線程中的某個(gè)線程的數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí)請(qǐng)注意這一點(diǎn),例如Selenium。

[Rails 4 & Rails 5.0.x]JavaScript驅(qū)動(dòng)程序(Selenium)和Capybara  Webkit的驗(yàn)收測(cè)試問(wèn)題。

Selenium在另一個(gè)線程上運(yùn)行,因此它不能與運(yùn)行RSpec的主線程共享事務(wù)。為了讓客戶端應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),RSpec需要將改動(dòng)提交。這類情況下可以允許提交數(shù)據(jù),然后手動(dòng)清理數(shù)據(jù)。

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

要解決上述問(wèn)題,首先需要禁用Rails派生的事務(wù),將config.use_transactional_fixtures設(shè)置為false,或干脆刪除它。DatabaseCleaner是一個(gè)gem,它提供了清理數(shù)據(jù)庫(kù)的高級(jí)策略,例如刪節(jié)、事務(wù)處理或刪除。

下面是利用DatabaseCleaner處理上述JS驅(qū)動(dòng)程序問(wèn)題的著名gist:

Rspec中怎么清理陳舊數(shù)據(jù)

[從Rails 5.1起]數(shù)據(jù)庫(kù)事務(wù)在測(cè)試線程之間共享

線程之間的共享數(shù)據(jù)庫(kù)事務(wù)由Rails團(tuán)隊(duì)的Eileen完成,并作為Rails 5.1的一部分內(nèi)容發(fā)布。

Rspec中怎么清理陳舊數(shù)據(jù)
加入了lock_thread
Rspec中怎么清理陳舊數(shù)據(jù)
為測(cè)試啟用了lock_thread

關(guān)于Rspec中怎么清理陳舊數(shù)據(jù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI