未绑定方法 f() 必须以 x 实例作为第一个参数调用(取而代之的是 str 实例)
unbound method f() must be called with x instance as first argument (got str instance instead)
这是我的 class:
class GoogleCloudLayer:
def deleteMachine(self, machineName):
return machineName + ' is dead. (stubbed)'
有效:
>>> gc = GoogleCloudLayer()
>>> gc.deleteMachine('test')
test is dead (stubbed)
但我想在测试中使用并且我想在其上定义 assert_called_with
方法:
from mock import MagicMock
#Stubbing with itself just so it will have the `assert_called_with` method defined on it
GoogleCloudLayer.deleteMachine = MagicMock(side_effect = GoogleCloudLayer.deleteMachine)
但后来我得到
>>> gc = GoogleCloudLayer()
>>> gc.deleteMachine('test')
unbound method deleteMachine() must be called with GoogleCloudLayer instance as first argument (got str instance instead)
如果我将生产代码更改为 gc.deleteMachine(gc, 'test')
,它就可以工作。
但我们不希望这样,对吗?
lambda
在这种情况下很有用,试试:
GoogleCloudLayer.createMachine = MagicMock(side_effect = lambda *args, **kwargs: GoogleCloudLayer.createMachine)
这是我的 class:
class GoogleCloudLayer:
def deleteMachine(self, machineName):
return machineName + ' is dead. (stubbed)'
有效:
>>> gc = GoogleCloudLayer()
>>> gc.deleteMachine('test')
test is dead (stubbed)
但我想在测试中使用并且我想在其上定义 assert_called_with
方法:
from mock import MagicMock
#Stubbing with itself just so it will have the `assert_called_with` method defined on it
GoogleCloudLayer.deleteMachine = MagicMock(side_effect = GoogleCloudLayer.deleteMachine)
但后来我得到
>>> gc = GoogleCloudLayer()
>>> gc.deleteMachine('test')
unbound method deleteMachine() must be called with GoogleCloudLayer instance as first argument (got str instance instead)
如果我将生产代码更改为 gc.deleteMachine(gc, 'test')
,它就可以工作。
但我们不希望这样,对吗?
lambda
在这种情况下很有用,试试:
GoogleCloudLayer.createMachine = MagicMock(side_effect = lambda *args, **kwargs: GoogleCloudLayer.createMachine)