2017-06-16 27 views
0

Personというモデルで、deletion_dateという日時フィールドを単純に変更するビューPersonRemoveViewのユニットテストを作成しています。このフィールドは、このビューが実行されるまで、問題がdeletion_dateの値は、ユニットテストからのビューを実行した後Noneであることであるtimezone.now()Djangoユニットテストでデータベースが変更されていません

に設定されている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)に電話する必要があります。

関連する問題