[英]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
創建過程中的數據庫崩潰,並測試reservation
和reserved_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.