Как assertRaises Джанго.contrib.автор.модели.Doesnotexist исключение?

Я пытаюсь утверждать в тесте, что оператор вызывает это исключение, однако кажется, что невозможно импортировать указанное исключение. Это не работает, например:

from rest_framework.test import APITestCase
from rest_framework.test import APIRequestFactory
from CarPooling.views import login, logout
from django.urls import reverse
from django.contrib.auth.models import User, UserManager
from django.contrib.auth import authenticate
from rest_framework.authtoken.models import Token
from CarPooling.models import AccountActivationToken
from rest_framework import status
from django.contrib.auth.models import DoesNotExist

class LoginViewTests(APITestCase):
    def test_login(self):
        url = '/api/token/'
        data = {'email': 'up20@fe.up.pt', 'password': 'testpassword'}
        user = create_user('joao', 'testpassword', 'up20@fe.up.pt')
        user = User.objects.get()
        user.is_active = True
        user.save()                     
        response = self.client.post(url, data, format='json')       
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['token'], Token.objects.get(user=user).key)
        data = {'email': 'up20@fe.up.pt', 'password': 'tsubasaolivesr'}
        response = self.client.post(url, data, format='json')       
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        data = {'email': 'up20@fe.up.pt', 'password': 'tsubasaolivesr'}
        self.assertRaises(models.DoesNotExist, self.client.post(url, data, format='json'))

Тест не удается пожаловаться, что исключение django.автор.contrib.автор.модели.DoesNotExist был вызван, хотя я явно утверждаю, что это должно произойти.

1 ответ

  1. Вы тестируете не на том уровне. Использование клиента для публикации в представлении никогда не вызовет исключение Django; даже если это исключение не поймано в самом представлении, что почти наверняка так и есть, оно определенно будет поймано промежуточным программным обеспечением ошибки Django и представлено клиенту как ошибка 500.

    Таким образом, если вы действительно не ловите это исключение, вы можете проверить, что результат от сообщения имеет статус 500; в противном случае вам нужно проверить для любого сообщения, которое вы показываете пользователю, что модель не существует.