91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rspec中怎么清理陳舊數據

發布時間:2021-07-24 16:06:15 來源:億速云 閱讀:123 作者:Leah 欄目:數據庫

這篇文章將為大家詳細講解有關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中怎么清理陳舊數據就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

溆浦县| 安乡县| 深泽县| 扎兰屯市| 玛多县| 县级市| 息烽县| 井冈山市| 文成县| 阳泉市| 玉屏| 阳信县| 客服| 乐山市| 安乡县| 凯里市| 宣威市| 土默特右旗| 恩施市| 光山县| 独山县| 焦作市| 新昌县| 乐陵市| 兰坪| 息烽县| 贵溪市| 龙川县| 嫩江县| 桓仁| 滦平县| 乳源| 孝义市| 阿尔山市| 灵川县| 南和县| 新宾| 兴隆县| 永定县| 方城县| 玉山县|