2017-06-16 47 views
0

我創建一個單元測試的觀點PersonRemoveView,簡單地修改稱爲deletion_date在一個名爲Person模型時間字段。此字段None直到執行該視圖中,然後將其設置爲timezone.now()Django的單元測試不修改數據庫

的問題是,執行從單元測試的視圖後的deletion_date值爲None

這是測試:

def test_person_remove_view(self): person = models.Person.objects.get(pk=1) request = self.factory.post('/person/remove/{}'.format(person.id)) response = PersonRemoveView.as_view()(request, pk=person.id) self.assertIsNotNone(person.deletion_date)

和本所認爲:

class PersonRemoveView(PermissionRequiredMixin, generic.DeleteView): 
    model = Person 
    success_url = reverse_lazy('control:person_list') 

    def dispatch(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     self.object.deletion_date = timezone.now() 
     self.object.save() 
     return HttpResponseRedirect(self.success_url) 

我一直在調試和按預期執行dispatch方法,但臨時測試數據庫不改變和assertIsNotNone方法失敗

回答

1

模型的實例並不那麼你共享不得不重裝你的實例測試,以找出是否認爲正確地修改了底層數據庫記錄:

def test_person_remove_view(self): 
    person = models.Person.objects.get(pk=1) 
    request = self.factory.post('/person/remove/{}'.format(person.id)) 
    response = PersonRemoveView.as_view()(request, pk=person.id) 
    # reloads our instance values from the database 
    person.refresh_from_db() 
    self.assertIsNotNone(person.deletion_date) 
1

在您的測試,你從數據庫中獲取的Person實例,則執行該觀點,認爲修改數據庫,但不是您之前檢索的對象。執行視圖後,您需要撥打person.refresh_from_db()documentation),以獲取數據庫的最新更改。