Исправление декоратора в setUp или setUpClass в TestCases не работает - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь исправить некоторые функции во время использования методов setUp или setUpClass для подкласса unittest.TestCase.

Для данного модуля patch_me_not.py

# patch_me_not.py
def patch_me(at):
    print('I am not patched at {}.'.format(at))

def patch_me_not(at):
    patch_me(at)

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

# main.py
import unittest
from unittest.mock import patch
from patch_me_not import patch_me_not


@patch('patch_me_not.patch_me', lambda x: None)
class PatchMeNotTests(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('I am the setUpClass.')
        patch_me_not('setUpClass')

    def setUp(self):
        print('I am the setUp.')
        patch_me_not('setUp')

    def test_print(self):
        print('I am the test')
        patch_me_not('test_print')


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

Вывод тестового скрипта:

I am the setUpClass.
I am not patched at setUpClass.
I am the setUp.
I am not patched at setUp.
I am the test
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Где я не ожидал, что два слова "Я не исправлен в ..."строк в выводе, если патч работал в setUp и setUpClass.

Как мне получить фиктивное исправление, которое будет применено в этих методах?

1 Ответ

0 голосов
/ 24 октября 2018

Я думаю, вам нужно сделать следующее:

class PatchMeNotTests(unittest.TestCase):

    @classmethod
    <b>@patch('patch_me_not.patch_me', lambda x: None)</b>
    def setUpClass(cls):
        print('I am the setUpClass.')
        patch_me_not('setUpClass')

    <b>@patch('patch_me_not.patch_me', lambda x: None)</b>
    def setUp(self):
        print('I am the setUp.')
        patch_me_not('setUp')

    def test_print(self):
        print('I am the test')
        patch_me_not('test_print')

Исправление вашего тестового примера не сработало, потому что когда patch применяется к TestCase, оно исправляет только методы тестирования иличтобы быть более конкретным: методы, которые начинаются с настраиваемого префикса patch.TEST_PREFIX, значение по умолчанию - "test".Вот почему ваше решение не сработало.

Вот соответствующая цитата из unittest docs

Патч можно использовать в качестве декоратора класса TestCase.Это работает, украшая каждый метод теста в классе.Это сокращает стандартный код, когда ваши методы тестирования используют общий набор исправлений.patch() находит тесты, ища имена методов, которые начинаются с patch.TEST_PREFIX.По умолчанию это 'test', что соответствует тому, как unittest находит тесты.Вы можете указать альтернативный префикс, установив patch.TEST_PREFIX.

...