Как протестировать удаление экземпляра в Django
Работает Django, у меня есть представление для удаления вошедшего пользователя по POST запросу.
@login_required
def delete_user(request):
"""Delete user from DB."""
if request.method == "POST":
get_object_or_404(User, pk=request.user.pk).delete()
messages.success(request, _("User deleted!"), extra_tags="success")
return redirect("home")
return render(request, "accounts/delete-user.html")
HTML форма имеет вид:
<form method="POST" name="delete-user-form" id="delete-user-form">
{% csrf_token %}
<button class="mt-4 btn btn-danger" name="delete-user-btn" id="delete-user-btn" type="submit">{% translate "Delete my profile" %}</button>
</form>
Мой тестовый класс с пользователем:
class ViewsWithLoggedInUserTest(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
User.objects.create_user(
email="test@test.com",
password="test",
first_name="TestFirstName",
last_name="TestLastName",
hometown="Kiev",
facebook_link="https://www.facebook.com/profile.php?id=1000",
contacts="+380991111111",
start_coordinates="50.45, 30.52",
avatar="avatar/default_avatar.jpg",
)
def setUp(self):
self.user = User.objects.get(email="test@test.com")
self.client.force_login(user=self.user)
print("setUp")
def test_delete_user_post(self):
"""Test delete user post."""
response = self.client.post(path=reverse("delete_user"))
self.assertFalse(self.user)
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, expected_url=reverse("home"))
Я не могу понять, как проверить эту функцию, мой test_delete_user_post
выдает мне
AssertionError: <User: test@test.com> is not false
Это не работает, потому что переменная self.user
все еще хранит ранее присвоенное значение.
Используйте метод refresh_from_db()
для обновления переменной свежим значением.
Кроме того, чтобы проверить удаление, нужно проверить, возникает ли исключение DoesNotExist
или нет. Тестирование с помощью assertFalse
не сработает.
Пример кода:
def test_delete_user_post(self):
response = self.client.post(path=reverse("delete_user"))
with self.assertRaises(User.DoesNotExist):
# Django will try to fetch the new value from the database
# but since it's been deleted, DoesNotExist exception
# will be raised
self.user.refresh_from_db()
...
Альтернатива (менее сложная/более очевидная?) ответу xyres
# setUp created self.user which this test should delete ...
def test_delete_user_post(self):
response = self.client.post(path=reverse("delete_user"))
self.assertFalse( User.objects.filter( pk=self.user.pk).exists() )