Установить модульный тест для повышенного исключения в установщике свойств - PullRequest
0 голосов
/ 19 апреля 2020

Я использую свойство setter и выдает ошибки, если входные данные не ожидаемого типа. Я также провожу модульное тестирование всех функций и хочу проверить, что исключение на самом деле возникает при использовании сеттера.

Я пытаюсь получить вызываемое значение для unittest.TestCase.assertRaises. Вот пример:

import unittest

class A:
    def __init__(self, num):
        self.var = num

    @property
    def var(self):
        return self._var

    @var.setter
    def var(self, new):
        if not isinstance(new, int):
            raise TypeError
        self._var = new

class TestA(unittest.TestCase):
    def test_a_setter(self):
        a = A(5)
        self.assertRaises(TypeError, a.var = 'a') #<--- a not working try

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

Есть ли способ вызвать вызывающее устройство? Иначе, я просто буду использовать блок try ... except, но это не похоже на чистое решение.

Еще одна идея, которую я получил, - использовать setattr, но это не работает со свойством.

1 Ответ

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

Использование варианта менеджера контекста для assertRaises должно работать:

class TestA(unittest.TestCase):
    def test_a_setter(self):
        a = A(5)
        with self.assertRaises(TypeError):
            a.var = 'a'

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

И просто для полноты вот (уродливый) ответ на ваш актуальный вопрос:

class TestA(unittest.TestCase):
    def test_a_setter(self):
        a = A(5)
        self.assertRaises(TypeError, A.var.__set__, a, 'a')
        # alternative using lambda:
        self.assertRaises(TypeError, lambda: A.var.__set__(a, 'a'))
...