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)