2016-12-14 4 views
0

я в беде, заменяющую функцию питона из другого модуля с 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() 

работает правильно.

Что мне не хватает? может быть, это банальность, но это сводит меня с ума

Спасибо заранее

ответ

1

Ваш код под импорт тестов function_in_module и ссылки напрямую. Изменение значения module_name.function_in_module не влияет на код.

Вы должны заменить функцию непосредственно в модуле, который содержит тестируемый код, а не в исходном модуле.

Обратите внимание, что ваша жизнь будет проще, если вы использовали библиотеку mock, хотя вопрос о том, где патч по-прежнему будет таким же.

+0

Связанный, OP также * вызывает * функцию, о которой идет речь, и сохраняет ее возвращаемое значение, не сохраняя сама функция. – chepner

+0

Извините @ Даниэль, вы имеете в виду, что я должен называть 'function_in_module' в' def test_string', как этот 'function_in_module = self.mp.monkey_function_in_module', или я не понимаю? – Giordano

+0

Нет, совсем нет. Вы должны сделать 'module_that_defines_ExampleClass.function_in_module = ...'. И обратите внимание на то, что сказал чепнер. –