2014-11-23 40 views
2

我在模块下面的代码:Python的模拟补丁的功能缺失的参数

class MyManager(models.Manager): 

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

在模块B:

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

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

在单元测试我修补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

如果你有兴趣我填补这个给你一些其他接近这一任务更加有用的方式回答。问候 – 2014-11-25 07:54:48

回答

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_callable' – 2014-11-24 00:28:58

+1

从文档:_new_callable允许您指定一个不同的类或可调用的对象,将被调用创建新的对象。默认情况下使用MagicMock._因此,如果您想要替换默认的'MagicMock'“嘲笑者”类,那么它看起来就像它被使用了,我猜测它是你很少需要的东西(它似乎试图实例化一个类,因此,在这个特定的例子中,最终运行你的函数)但这只是一个猜测(我对Mock的了解还不够多) – BorrajaX 2014-11-24 00:31:05