2012-11-02 90 views
0

所以我必須具有設置methiod創建可對被測試的模型對象測試類:Django的測試增加PK的問題

class UserProjectTests(TestCase): 

    fixtures = ['admin_test.json'] 

    def setUp(self): 
     ... 
     self.project1 = Project.objects.create(
      user=self.user_profile1, 
      product=self.product1, 
      module=self.module1, 
      model=self.model1, 
      zipcode=90210 
     ) 
     self.project1.save() 

    def test_module_created(self): 
     ... 

    def test_model_created(self): 
     ... 

    def test_product_created(self): 
     ... 

    def test_project_created(self): 
     #! what happened to pk<4??? 
     result1 = Project.objects.get(pk=4) 
     self.assertEquals(result1.zipcode, 90210) 

    def test_user_cannot_edit_project_they_dont_own(self): 
     ... 

我的問題是 - 爲什麼我要叫pk=4得到測試數據庫中唯一的對象?如果我將這個測試向上移動幾個函數,我必須查詢通過測試的pk減少。似乎每次安裝程序運行它都不會從一個處女db開始,因爲pk是自動遞增的。

誰能告訴我這是爲什麼?無論在哪個測試函數中出現,我應該怎麼做才能使用pk = 1?

回答

1

Django的測試運行器在每次測試後刷新數據庫,但並未將其刪除並重新創建 - 這會顯着降低測試速度。

而不是硬編碼一個PK號碼,你可以問第一個元素:Project.objects.all()[0]。由於您每次開始使用空表進行測試,因此可以保證爲您提供所需的物品。

+0

好的。出於興趣 - 測試運行者是否不使用'truncate'來刷新表格?我認爲這會將自動增量值返回到0。 –

0

如果真的是預計這將是在DB的唯一對象,您可以檢索它像:

result1 = Project.objects.get() 

如果發現不止一個(或無)目的將引發一個錯誤。它可能會更安全:

result1 = Project.objects.all()[-1] 

這將檢索最後一個對象。