2016-10-12 17 views
1

我正在運行一些需要手動調試的unittests。 在這些測試中,沒有任何東西會寫入數據庫。在django unittests期間,數據庫保持爲空

有什麼辦法強制Django(或pytest?)在執行時直接提交更改,以便我可以在打斷點時真正看到數據庫中有什麼?

my_object = SomeDefaultDjangoModel() 
my_object.some_random_text = 'Just adding some data' 
my_object.save() 

foo = 'bar' <= Hitting breakpoint here. 

對我的數據庫執行手動SQL查詢返回0行。 我該如何做這項工作?

*更新*

的問題是,Django的不允許您更改保存到數據庫中,直到每個請求的結束,在大多數情況下不是問題。 但是,當您想繞過ORM並正在使用原始連接執行查詢時,它似乎爲此啓動了單獨的數據庫連接。由於所有事務都處於掛起狀態,直到請求結束,因此無法從其他數據庫連接訪問這些更改。這將返回無效結果,並使我的單元測試失敗。

我還沒有找到一種提交待處理事務的方法,所以我想我會開始將save_raw()方法寫入我的模型中,直接將數據保存到數據庫中。

+0

或者您確定您正在查詢您的測試數據庫?它應該與您的「正常」數據庫分開。 – elethan

+0

看看這個https://docs.djangoproject.com/en/1.10/topics/testing/advanced/#advanced-features-of-transactiontestcase –

回答

0

TransactionTestCase而不是TestCase子類化測試,然後數據將按預期保存/提交,因此您可以直接檢查數據庫中的數據。

the docs

Django的TestCase類是 TransactionTestCase一款較爲常用的子類,利用數據庫事務的 設施,加快開頭重置數據庫到 已知狀態的過程的每個測試。然而,這樣做的後果是,某些數據庫行爲無法在類Django TestCase類中測試。例如,您不能測試 代碼塊在交易中執行的情況,因爲在使用 select_for_update()時需要這樣做。在這些情況下,您應該使用 TransactionTestCase

TransactionTestCaseTestCase是除了方式 ,其中,數據庫被複位到一個已知的狀態,並測試提交和回滾的影響的能力 測試代碼相同:

  • TransactionTestCase復位數據庫在運行後通過 截斷所有表。 A TransactionTestCase可能會調用commit和 回滾並觀察這些調用對數據庫的影響。
  • 另一方面,A TestCase在測試後不會截斷表格。 取而代之的是,它將測試代碼封裝在數據庫事務中,該事務在測試結束時回滾爲 。這保證了在測試結束時的回滾 將數據庫恢復到其初始狀態。