2014-11-23 2 views
2

У меня есть следующий код в модуль: сPython издеваться патч функция отсутствует аргументы

class MyManager(models.Manager): 

    def dowork(self, value1, value2): 
     print value1, value2 

В модуле б:

class MyModel(models.Model): 
    objects = MyManager() 
    value1 = ...   
    value2 = ... 

    def call_manager(self): 
     self.objects.dowork(self.value1, self.value2) 

В UnitTest я Патченье dowork с другим телом, например, как:

def new_dowork(self, value1, value2): 
    print 123 

with patch('a.MyManager.dowork', new_callable=new_dowork): 
    record = MyModel(value=111) 
    record.call_manager() 
    ... 

Но я получаю TypeError: new_dowork() takes exactly 3 arguments (0 given)

+0

Если вы заинтересованы я заполнить ответ, который даст вам некоторые другие более полезный способ приблизиться к этой задачи. С уважением –

ответ

1

Я не знаю много о Mock, но я думаю, что главная проблема в том, что вы должны передать фиктивную функцию в new аргументе, а не в new_callable и использовать patch.object фактически переписать метод внутри объекта.

Это похоже на работу:

from mock import patch 

class MyManager(object): 

    def dowork(self, value1, value2): 
     print value1, value2 

class MyModel(object): 
    objects = MyManager() 
    value1 = 'foo'   
    value2 = 'bar' 

    def __init__(self, value=0): 
     # You don't need this __init__... Is just so I don't have to 
     # use models.MyModel thingy 
     pass 

    def call_manager(self): 
     self.objects.dowork(self.value1, self.value2) 

def new_dowork(self, value1, value2): 
    print "Mock called" 
    print 123 

with patch.object(MyManager, 'dowork', new=new_dowork): 
    record = MyModel(value=111) 
    record.call_manager() 

Воспроизводит:

Mock called 
123 
+0

Прохладный, с использованием 'new' работал, мне все еще кажется, что есть проблема, когда использовать' new' или 'new_callable' –

+1

Из документов: _new_callable позволяет указать другой класс или вызываемый объект, который будет вызываться создать новый объект. По умолчанию используется MagicMock._ Таким образом, похоже, что он используется, если вы хотите заменить класс «mocker» по умолчанию «MagicMock», который, как я предполагаю, является чем-то, что вам редко нужно (кажется, пытается создать экземпляр класса, поэтому в этом конкретном примере заканчивается выполнение вашей функции). Но это всего лишь предположение (я не знаю почти достаточно о Mock, чтобы быть уверенным в этом) – BorrajaX

Смежные вопросы