Правильное использование assertRaises в Python модульных тестах - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь понять, как правильно использовать assertRaises() в Python модульном тестировании. У меня есть ValueError в моей функции, которая повышается. Тем не менее, при тестировании в моих модульных тестах я получаю смешанные результаты с двумя различными способами использования `assertRaises ().

Когда я пишу такой тест, он работает:

import unittest

class MyTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        pass

    def test_error(self):
        with self.assertRaises(ValueError):
            func(a)

Однако, если я напишу свой тест, как показано ниже, он не будет работать, даже если значение ValueError будет повышено:

    def test_error(self):
        self.assertRaises(ValueError, func(a))

Кто-нибудь знает, почему один из способов будет работать, а другой - нет? «т

1 Ответ

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

Метод asserRaises принимает список переменных аргументов, где первый аргумент является объектом функции, а необязательные другие аргументы являются аргументами функции. Вы должны вызывать его так (обычным образом):

def test_error(self):
    self.assertRaises(ValueError, func, a)

Или используя лямбду:

def test_error(self):
    self.assertRaises(ValueError, lambda: func(a))

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

Сказав Я бы предпочел вариант с контекстным менеджером, так как он лучше читается.

...