Django Rest Framework тестирование разрушить представление не удается
Я получил следующий тестовый пример:
def test_delete_address(self) -> None:
"""test disable address"""
# res = create_object_helper(self.client, self.url, self.data, self.headers)
res = self.client.post(self.url, json.dumps(self.data), **self.headers)
self.assertEqual(res.status_code, 204)
address = AddressBook.objects.all().first()
url = reverse(
"marketplace_api:add-order-address-detail", kwargs={"pk": address.id}
)
res = self.client.delete(url, **self.headers)
self.assertEqual(res.status_code, 204)
address.refresh_from_db()
breakpoint()
self.assertTrue(address.disabled)
А также взгляд со стороны:
def destroy(self, request, *args, **kwargs):
try:
instance = AddressBook.objects.get(id=kwargs.get('pk'), user=request.user)
except ObjectDoesNotExist:
return Response(
{"error": "Address was not found"}, status.HTTP_404_NOT_FOUND
)
breakpoint()
if instance.disabled:
return Response(
{"error": "Address was not found"}, status.HTTP_404_NOT_FOUND
)
instance.disabled = True
instance.save()
add = AddressBookSerializer(instance=instance)
return Response(add.data, status.HTTP_204_NO_CONTENT)
Что я пытаюсь достичь, так это протестировать мой переопределенный метод, где я не уничтожаю экземпляр, а просто изменяю флаг. Проблема, с которой я сталкиваюсь, заключается в том, что мой тестовый пример получает другие данные из БД, чем в представлении. Чтобы проверить это, я распечатал некоторые результаты в pdb:
Данные ответа (res.data
) -> возвращены из просмотра:
{'id': 1, 'invoice': False, 'user': 81, 'first_name': 'Test name', 'last_name': 'Test name', 'street': 'Unknown', 'building': 'Unknown', 'place': 'Unknown', 'city': 'Unknown', 'zip_code': 'Unknown', 'phone_number': 'Unknown', 'email': 'test@test.pl', 'company_name': None, 'nip': None, 'remarks': None, 'disabled': True, 'created': '2022-08-02 15:17:50'}
Данные адреса объекта: (address.__dict__
):
{'_state': <django.db.models.base.ModelState object at 0x0000026308ED92B0>, 'id': 1, 'user_id': 81, 'first_name': 'Test name', 'last_name': 'Test name', 'street': 'Unknown', 'building': 'Unknown', 'place': 'Unknown', 'city': 'Unknown', 'zip_code': 'Unknown', 'phone_number': 'Unknown', 'email': 'test@test.pl', 'company_name': None, 'nip': None, 'remarks': None, 'disabled': False, 'created': datetime.datetime(2022, 8, 2, 13, 17, 50, 108551, tzinfo=<UTC>), '_prefetched_objects_cache': {}}
И последнее, что я сделал, это повторный запрос к БД и проверка объекта, который сохранен (AddressBook.objects.all().first().__dict__
):
{'_state': <django.db.models.base.ModelState object at 0x0000026308EB8400>, 'id': 1, 'user_id': 81, 'first_name': 'Test name', 'last_name': 'Test name', 'street': 'Unknown', 'building': 'Unknown', 'place': 'Unknown', 'city': 'Unknown', 'zip_code': 'Unknown', 'phone_number': 'Unknown', 'email': 'test@test.pl', 'company_name': None, 'nip': None, 'remarks': None, 'disabled': False, 'created': datetime.datetime(2022, 8, 2, 13, 17, 50, 108551, tzinfo=<UTC>)}
Результат моего расследования таков: представление изменяет состояние объекта (отключено с False на True), но после возврата к тестовому методу состояние базы данных изменяется. Может ли кто-нибудь объяснить мне, почему? Что я делаю не так, и как это исправить?