簡體   English   中英

RSpec:當有更多數據庫操作時,如何測試數據庫失敗

[英]RSpec: how to test database fails when there's more database operations

我有類似的方法:

def create
  reservation = Reservation.create(params[:reservation_params])
  if reservation.valid?
    reserved_hour = ReservedHour.create(params[:reserved_hour_params])
    if reserved_hour.valid?
      notification = Notification.create(params[:notification])
      if !notification.valid?
        reservation.destroy
        reserved_hour.destroy
      end
    else
      reservation.destroy
    end
  end
end

現在,我想使用RSpec測試數據庫失敗案例。 例如,我想模擬notification創建過程中的數據庫崩潰,並測試reservationreserved_hour是否成功銷毀。 有什么方法可以執行此操作而無需擴展我的create方法(僅出於測試目的)? 我可以通過運行ActiveRecord::Base.remove_connection模擬這三種情況下的ActiveRecord::Base.remove_connection ,但是我不知道如何通過一次崩潰來測試這種情況。

您的代碼將無法正常工作,因為所有.create調用都將始終返回某些內容 (保存的記錄或未保存的記錄),並且if語句將始終為true。

為什么不使用.create! 事務內(如果create不成功,則會引發錯誤)。 就像是:

def create
  ActiveRecord::Base.transaction do 
    begin
      Reservation.create!(params[:reservation_params])
      ReservedHour.create!(params[:reserved_hour_params])
      Notification.create!(params[:notification])
    rescue SomeError =>
      # do something with SomeError
    end
  end
end

這樣,如果您遇到錯誤並且不必進行所有.destroy業務,那么您的事務將被回滾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM