我在模块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)
我对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)
| 归档时间: |
|
| 查看次数: |
3144 次 |
| 最近记录: |