Python Unittest: модульная проверка сообщения, переданного в возбужденном исключении - PullRequest
0 голосов
/ 06 апреля 2020

Я тестирую радиус круга с помощью каркаса unittest в Python. Если радиус не является числовым значением c, то я поднимаю и исключение с пользовательским сообщением.

Файл: circle.py

class Circle():

    def __init__(self, radius):
        if not isinstance (radius, (int,float)):
            raise TypeError('radius must be a number')
        else:
            self.radius = radius

Файл: test_circle.py

import unittest
from circle import Circle

class CircleTest(unittest.TestCase):

    def test_radius(self):
        c1 = Circle(2.5)
        self.assertEqual(c1.radius, 2.5)

    def test_radius_type(self):
        self.assertRaises(TypeError, Circle, 'hello')

if __name__ == "__main__":
    unittest.main()

Теперь я могу проверить возникшее исключение. Но я также хочу выяснить, является ли сообщение, переданное в исключении, точным или нет. Кто-нибудь может подсказать, как проверить и проверить сообщение, переданное в исключении в unittest в Python?

1 Ответ

1 голос
/ 06 апреля 2020

Если вы хотите проверить сообщение об ошибке в исключении, вам нужно захватить исключение.

def test_radius_type(self):
    with self.assertRaises(TypeError) as exc:
        c = Circle('hello')
    self.assertEquals(str(exc), "radius must be a number")

При этом пользовательское исключение будет чище.

class NotANumberError(TypeError):
    pass


class Circle:
    def __init__(self, radius):
        try:
            self.radius = float(radius)
        except ValueError:
            raise NotANumberError


...

def test_radius_type(self):
    self.assertRaises(NotANumber, Circle, 'hello')

Тип самого исключения несет ту же информацию, что и произвольное сообщение об ошибке.

...