я в беде, заменяющую функцию питона из другого модуля с TestClassобезьяны патч питона функции - вопрос
Я пытаюсь проверить часть моего кода, который содержит функцию в модуле; подробнее я хотел бы, чтобы обезьяна исправляла эту функцию.
Таким образом, ситуация похожа на следующее:
функции в модуле
def function_in_module():
# do some stuff
return 'ok'
Часть моего кода, который я хотел бы испытывать
from dir_1.dir_2.dir_3.module_name import function_in_module
class ExampleClass():
def __init__(self):
# do some stuff
self.var_x = function_in_module()
# do some stuff again
Класс испытания
from dir_1.dir_2.dir_3 import module_name
class TestClass(TestCase):
de_monkey = {}
mp = None
def setUp(self):
# save original one
self.de_monkey['function_in_module'] = module_name.function_in_module()
if self.mp is None:
self.mp = MP()
def tearDown(self):
# rollback at the end
module_name.function_in_module = self.de_monkey['function_in_module']
def test_string(self):
module_name.function_in_module = self.mp.monkey_function_in_module
test_obj = ExampleClass()
self.assertEqual(test_obj.var_x, 'not ok')
class MP(object):
@staticmethod
def monkey_function_in_module(self):
return 'not ok'
Как показано в заявлении assert, ожидаемый результат «не нормально», но результат «ok».
Я отлаживаю это и кажется, что причиной этого является другой способ вызова функций, потому что этот патч обезьяны не работает.
В самом деле, если я пытаюсь вызвать функцию в ExampleClass таким образом
self.var_x = module_name.function_in_module()
работает правильно.
Что мне не хватает? может быть, это банальность, но это сводит меня с ума
Спасибо заранее
Связанный, OP также * вызывает * функцию, о которой идет речь, и сохраняет ее возвращаемое значение, не сохраняя сама функция. – chepner
Извините @ Даниэль, вы имеете в виду, что я должен называть 'function_in_module' в' def test_string', как этот 'function_in_module = self.mp.monkey_function_in_module', или я не понимаю? – Giordano
Нет, совсем нет. Вы должны сделать 'module_that_defines_ExampleClass.function_in_module = ...'. И обратите внимание на то, что сказал чепнер. –