簡體   English   中英

Django測試commit_on_success

[英]Django testing commit_on_success

我有一個函數,我已經在@transaction.commit_on_success包裝並運行Django單元測試。

該功能太長而無法粘貼,但有些偽代碼是:

@transaction.commit_on_success
def func():
  order = Order.create()
  order.save()
  OrderItem.create(order=order)
  test = 10/0 # make sure we run into an error

然后在我的單元測試中,我檢查len(Order.objects.all()) == 0

我的函數返回一個有效的Order對象,因此事務正在提交。

我在這做錯了什么?

編輯:我在Django 1.5上

弄清楚了。

我需要使用TransactionTestCase (沒有1.5的文檔)。

TransactionTestCase可以調用commit和rollback,並觀察這些調用對數據庫的影響。

之前我遇到過這個問題,但試圖將它與TestCase結合使用。 它們是互斥的,您的單元測試只能使用一個或另一個。 因為我們正在使用自定義測試類,所以我必須進行一些操作,但現在一切都正常回滾。

它看起來像Django 1.8 TestCase現在支持事務測試:

在舊版本的Django中,無法在TestCase中測試事務提交和回滾的影響。 隨着Django 1.8中舊式事務管理的棄用周期的完成,TestCase中不再禁用事務管理命令(例如transaction.commit())。

感謝John和siracoj的回答。 不管怎樣我最好從1.5升級;)

如果您使用MySQL,您的表可能不支持交易。 有關詳細信息,請參閱有關事務的Django文檔。

你應該使用@transaction.atomic ,自django 1.6以來,commit_on_success已被折舊,因為它不可靠。

有關更多信息,請查看以下答案: “transaction.atomic”與“transaction.commit_on_success”相同嗎?

編輯(因為你使用的是1.5):

可能的解決方法是使用@transaction.commit_manually ,如下所示: https//docs.djangoproject.com/en/1.5/topics/db/transactions/#django.db.transaction.commit_manually

暫無
暫無

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

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