Django/Python assertRaises с проверкой сообщений

Я относительно новичок в Python и хочу использовать тест assertRaises для проверки ValidationError, который работает нормально. Тем не менее, у меня есть много ValidationError, и я хочу убедиться, что вернут правильный. Я решил, что могу что-то передать в assertRaises, но он не выглядит так, как я могу, поэтому я решил, что просто сделаю assertTrue и проверит сообщение об исключении. Однако я не знаю, как получить к нему доступ. Это даже хороший способ подойти к этой проблеме? спасибо.

class DailyEntriesTests(TestCase):
def test_cant_have_ip_and_user(self):
    u = createUser(False)
    de = createDailyEntry(u, "1.1.1.1", 1)
    with self.assertRaises(ValidationError) as cm:
        de.full_clean()

    # this line bombs - message doesn't exist. I also tried "error_code" like I saw in the documentation, but that doesn't work
    print(cm.exception.message)

    self.assertTrue(cm.exception.message.contains("Both"))

Ответы

Ответ 1

Вы можете просто использовать assertRaisesRegexp.

with self.assertRaisesRegexp(ValidationError, "Both"):
    de.full_clean()

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

Ответ 2

Поскольку вопрос связан с Django, вы также можете использовать диспетчер контекста assertRaisesMessage при наследовании от django TestCase.

from django.test import TestCase

class ExceptionTest(TestCase):

    def test_call_raises_exception_with_custom_message(self):
        with self.assertRaisesMessage(Exception, 'My custom message!'):
            call_that_causes_exception()

Примечание. Диспетчер assertRaisesMessage выполняет поиск в сообщении об исключениях. Поэтому, если ваше исключение вызывает "Мое пользовательское сообщение!" вы даже можете утверждать, что это "пользовательское сообщение". Имейте это в виду, если вы определили несколько исключений, возвращающих похожие сообщения (например, вышеупомянутый тест также передается с сообщением типа "Мое пользовательское сообщение!" И вот некоторые дополнительные подробности. "Это может быть не желаемый результат".

Ответ 3

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

with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)