Django тест не добавляет покрытие с AssertRaises - PullRequest
0 голосов
/ 23 апреля 2020

Есть две строки, которые не выполняются django тестами, когда они называются self.assertRaises.

Я использую: Python 3.6.9, Django 3, Coverage.

У меня есть этот класс:

class AverageWeatherService:
    subclasses = WeatherService.__subclasses__()
    valid_services = {
        subclass.service_key: subclass for subclass in subclasses
    }

    @classmethod
    def _check_service(cls, one_service):
        if one_service not in cls.valid_services:
            logger.exception("Not valid service sent")
            raise NotValidWeatherFormException("Not valid service sent")

И у меня есть локальный API, который включен в мой p c.

Затем я написал этот тест:

def test_integration_average_temp_services_error(self):
    self.assertRaises
    (
        NotValidWeatherFormException,
        AverageWeatherService()._check_service,
        "MyFakeService",
    )

И хотя проверка прошла успешно с , когда assert повышается должным образом, этот тест не добавляет покрытие , но если я вызываю этот метод не так, как этот:

def test_integration_average_temp_services_error2(self):
    self.assertRaises
    (
        NotValidWeatherFormException,
        AverageWeatherService()._check_service("MyFakeService")
    )

Тогда, конечно, я получаю ошибку при выполнении теста, потому что исключение вызывается и неправильно перехватывается assertRaises НО Это добавляет покрытие. Если я выполню этот тест неправильно, мой код будет покрыт на 100%. Если я использую assertRaises в качестве первого способа, эти две строки не покрываются (в соответствии с покрытием html).

logger.exception("Not valid service sent")
raise NotValidWeatherFormException("Not valid service sent")

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

Любые идеи что происходит?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Я мог бы решить это.

Это обходной путь:

def test_integration_average_temp_services_error(self):
    with self.assertRaises(NotValidWeatherFormException):
        AverageWeatherService()._check_service("MyFakeService")
...