2013-02-26 53 views
0

不要浪費你的時間讀了這個問題。它已經在下面回答了。Django的 - 通過代碼測試創建的對象不會出現在測試數據庫

我的settings.py包含:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': 'foo.db', 
     'TEST_NAME': 'thetest.db' 
    } 
} 

在測試代碼是這一行:

allShoes = models.Shoe.objects.filter() 

allShoes應包含的對象,因爲該表由views.py稀少,但它是空的在代碼中。我還在測試代碼中放置了一個set_trace()來暫停它,並用sqlite3程序驗證foo.db包含對象,而不是thetest.db。

我已經試過交替派生我的模型類,鞋,從django.test.TestCase和django.test.TransactionTestCase。都沒有工作。

我使用:

>>> django.VERSION 
(1, 4, 3, 'final', 0) 

(venv)bmac:ol b$ python 
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 

有什麼我做錯了任何想法?

編輯: 只是爲了澄清,foo.db是空的,剛剛由syncdb創建,在測試運行之前並且test.db不存在。我的測試是一個Selenium測試,它導致一個視圖(被測代碼的一部分)被調用,然後在頁面上進行兩次點擊。每次點擊都有一個調用另一個視圖的AJAX處理程序;該視圖(更多代碼在測試中)在數據庫中創建一個條目。所以,最後,在數據庫被測試運行器銷燬之前,應該在數據庫中有兩次點擊。

編輯: 我刪除TEST_NAME從數據庫到使問題更加簡單,雖然我已經看到了行爲沒有區別。在運行測試時,從我的視圖代碼我可以運行:

models.Shoe.objects.using('default').all() 

並查看對象。但是,從我的測試例程中,相同的語句產生一個空列表。

+0

我對任何東西都不使用SQLite,但它看起來好像使用SQLite時的測試數據庫完全是內存中的,這可以解釋您缺少的對象:https://docs.djangoproject.com/en/1.4/主題/測試/#測試數據庫 – Brandon 2013-02-26 02:46:43

+0

@Brandon我編輯的問題,使其特別清楚,對象不是代碼中的allShoes。 – Brian 2013-02-26 03:40:36

+0

如果沒有看到在測試中填充db的代碼,很難知道。 – monkut 2013-02-26 03:57:55

回答

0

我還沒有證實這一解決辦法,但不希望人們把這些時間花在讀書這個問題。我相信問題在於我從我的測試代碼運行Django開發服務器,這樣我就可以模擬連接脆弱性。這導致生產數據庫被使用,並解釋了爲什麼測試數據庫是空的。 D'哦。

+0

請確認此解決方案,如果正確,請將其標記爲正確答案。 – bignose 2013-10-08 23:31:57

1

當Django的測試運行執行,生產數據庫沒有被觸及。在我們的問題中,foo.db是您的生產數據庫,Django確保在您運行單元測試時未觸及此問題。相反,它會創建一個新的數據庫只是爲了運行測試的目的。通常,這將是一個內存數據庫SQLite的,但因爲你已經在settings.py指定TEST_NAME,測試數據庫將磁盤上的數據庫名爲thetest.db

除非你打電話給你的視圖代碼在您的測試過程中,填充的記錄,會有什麼在thetest.db

測試用例可能會是這個樣子。

from django.test import TestCase 

class MyTest(TestCase): 

    def test_something(self): 
     # Simulate a browser POST which would populate an object in Shoes. 
     # When the test starts, the db is empty. 
     response = self.client.post('/shoe/add/', { 
      # Post data here. 
     }) 

     self.assertEqual(
      1, 
      models.Shoe.objects.count()) 
+0

請參閱我的說明。我很抱歉,這不夠清楚。 – Brian 2013-02-26 14:24:42

相關問題