Python 模拟修补缺少参数的函数

Jam*_*Lin 2 python mocking

我在模块a中有以下代码:

class MyManager(models.Manager):

    def dowork(self, value1, value2):
        print value1, value2
Run Code Online (Sandbox Code Playgroud)

在模块b中:

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

    def call_manager(self):
        self.objects.dowork(self.value1, self.value2)
Run Code Online (Sandbox Code Playgroud)

在单元测试中,我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()
    ...
Run Code Online (Sandbox Code Playgroud)

但我越来越TypeError: new_dowork() takes exactly 3 arguments (0 given)

Bor*_*jaX 5

我对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()
Run Code Online (Sandbox Code Playgroud)

这输出:

Mock called
123
Run Code Online (Sandbox Code Playgroud)