TestCase
和TransactionTestCase
之間的主要區別是,TestCase
封裝測試與atomic()
塊所有的時間。從documentation:
裹在兩個嵌套的原子()塊的測試:一個是整個班級,一個用於每個測試
現在,假設你有一個應該提高,如果一個錯誤的方法它不包裹在atomic()
區塊內。您正試圖爲此編寫測試:
def test_your_method_raises_error_without_atomic_block(self):
with self.assertRaises(SomeError):
your_method()
此測試意外失敗!原因是,你猜對了,TestCase
用atomic()
把所有的時間都封存在測試中。因此,your_method()
不會引發錯誤,這就是測試失敗的原因。在這種情況下,您應該使用TransactionTestCase來通過測試。
select_for_update()就是一個明顯的例子:
上支持SELECT ... FOR UPDATE後端評估與select_for_update()在自動提交模式下的queryset是TransactionManagementError錯誤
從TransactionTestCase documentation:
帶有TestCase類,您不能測試代碼塊是否在一個transactio內執行N,如使用select_for_update()
時必需的,如果我們看一看的select_for_update()
的文檔,我們看到了一個警告:
雖然select_for_update()在自動提交模式下正常失敗,因爲TestCase會自動將每個測試包裝在一個事務中,即使在一個atomic()塊之外的TestCase中調用select_for_update()方法也會(可能意外地)傳遞,而不會引發TransactionManagementError。要正確測試select_for_update(),你應該使用TransactionTestCase。
希望它有幫助!
是的,它的幫助! ,我有很多疑問。顯然我無法理解交易。如果你不介意,你會給我你的聯繫方式,以便進行完美的聊天。因爲我不能在這裏聊天 –
對不起,我沒有在您的個人資料中找到任何關於聯繫人的信息。這就是我在這裏問的原因。請考慮我 –
@vishnumc給我發電子郵件[email protected] –