Почему в модульном тесте Django не возникает повышенное исключение? - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь проверить статический метод в одной из моих моделей, но тест не видит возникшее исключение, и я не понимаю, почему.

Вот модель и статический метод:

# models.py
class List(models.Model):
    owner = models.ForeignKey(User)
    type = models.ForeignKey('ListType', help_text=_('Type of list'))
    name = models.CharField(_('list'), max_length=128, help_text=_('Name of list'))

class ListType(models.Model):
    type = models.CharField(_('type'), max_length=16)

@staticmethod
def read_list(list_id, list_name, owner, list_type):
    try:
        return List.objects.get(pk=list_id, name=list_name, owner=owner, type=list_type)
    except List.DoesNotExist:
        return None

Вот тест:

# tests.py
from django.test import TestCase
from .factories import *
from .models import List, ListType

class TestFuncs(TestCase):
    def test_read_list_exc(self):
        with self.assertRaises(List.DoesNotExist):
            uf = UserFactory()
            lt = ListType.objects.get(type='Member')
            lf = ListFactory(owner=uf, type=lt, name='foo')
            # I've created one list but its name isn't 'bar'
            list = List.read_list(999, 'bar', uf, lt)

Если я установил точку останова отладки в методе read_list и запустил тест, я вижу возникающее исключение:

# set_trace output:
(<class 'list.models.DoesNotExist'>, DoesNotExist('List matching query does not exist.',))

# test output:
...
File "...."
    list = List.read_list(999, 'bar', uf, lt)
AssertionError: DoesNotExist not raised

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

        ...
        with self.assertRaises(list.models.DoesNotExist):
        ...

Кто-нибудь может увидеть, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

В статическом методе вы перехватываете исключение и возвращаете None.

. Вы можете либо изменить тест на использование assertIsNone.

l = List.read_list(999, 'bar', uf, lt)  # don't use list as a variable
self.assertIsNone(l)

Или, если вы действительно хотитеметод, чтобы вызвать исключение, а затем удалить try..except.

@staticmethod
def read_list(list_id, list_name, owner, list_type):
    return List.objects.get(pk=list_id, name=list_name, owner=owner, type=list_type)
0 голосов
/ 30 мая 2018

Вы уже обработали DoesNotExist исключение внутри read_list, поэтому оно не было выброшено в тестовый набор.

Чтобы вызвать исключение, вы можете использовать оператор raise:

@staticmethod
def read_list(list_id, list_name, owner, list_type):
    try:
        return List.objects.get(pk=list_id, name=list_name, owner=owner, type=list_type)
    except List.DoesNotExist as e:
        some actions to handle exception, for example logging
        ...
        raise e 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...