Я пытаюсь исправить некоторые функции во время либо методов 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
.
Как я могу применить фиктивный патч в этих методах?
Дело не в самой функции, это всего лишь пример. В моем реальном случае использования я не исправляю stdout.write
, но возникает та же проблема.
Я обновил свой вопрос, чтобы получить более полный пример, объясняющий проблему.
Думаю, вам нужно это сделать:
class PatchMeNotTests(unittest.TestCase):
@classmethod
@patch('patch_me_not.patch_me', lambda x: None)
def setUpClass(cls):
print('I am the setUpClass.')
patch_me_not('setUpClass')
@patch('patch_me_not.patch_me', lambda x: None)
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
Patch can be used as a TestCase class decorator. It works by decorating each test method in the class. This reduces the boilerplate code when your test methods share a common patchings set.
patch()
finds tests by looking for method names that start withpatch.TEST_PREFIX
. By default, this is'test'
, which matches the way unittest finds tests. You can specify an alternative prefix by settingpatch.TEST_PREFIX
.
Большое спасибо, это действительно работает! Не могли бы вы объяснить, почему декоратор на уровне класса не работает для этих двух методов?
@yellowcap Я обновил свой ответ объяснением
Разве вы не можете просто удалить отпечатки из своих методов настройки? Я не понимаю твоей проблемы. Вы хотите подавить весь вывод stdout?