Я столкнулся с проблемами с насмешливыми объектами в многопоточном сценарии. В большинстве частей моего проекта работает какой-то поток, который управляется отправкой сообщений, установкой флагов и т. Д. c. к этому. Некоторые из этих потоков используют объекты, которые не нужны во время тестирования и могут быть смоделированы. Единственный способ, которым я смог добиться этого, - это «сохранить» патч-контекст с другим потоком «бегуна»:
import unittest
import mock
import threading
def main_thread():
"""Wait for signals, messages"""
"""Do something with project.object"""
pass
class Test(unittest.TestCase):
def setUp(self):
runner_thread = threading.Thread(target=self.runner)
runner_thread.start()
def tearDown(self):
"""Signal 'main_thread' to exit"""
pass
def runner(self):
with mock.patch("project.object"):
thread = threading.Thread(target=main_thread)
thread.start()
thread.join()
def test_case_1(self):
"""Send messages to main_thread"""
"""Wait for response"""
"""Assert data"""
"""..."""
pass
Я хотел бы выяснить, почему это работает, или, может быть, Как я мог достичь этого по-другому. Хотя создание бегуна работает, это ужасно, и я не хочу писать его для каждого теста. Также, как мне изменить фиктивные объекты return_value et c. во время выполнения теста? Используйте self.mock_object
? Нет, спасибо, должен быть другой путь.