在Python中,我想使用minimock库来模拟类的__init__
方法。
这是解释器的作用(ipython):
In [1]: import minimock
In [2]: class A:
...: def __init__(self):
...: print "REAL INIT"
...:
In [3]: def new_init(self):
...: print "NEW INIT"
...:
In [4]: minimock.mock("A.__init__", returns_func=new_init)
In [5]: a = A()
Called A.__init__()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-144b248f218a> in <module>()
----> 1 a = A()
D:\Tools\Python27\lib\site-packages\minimock\__init__.pyc in __call__(self, *args, **kw)
492 if self.mock_tracker is not None:
493 self.mock_tracker.call(self.mock_name, *args, **kw)
--> 494 return self._mock_return(*args, **kw)
495
496 def _mock_return(self, *args, **kw):
D:\Tools\Python27\lib\site-packages\minimock\__init__.pyc in _mock_return(self, *args, **kw)
505 raise Exception("No more mock return values are present.")
506 elif self.mock_returns_func is not None:
--> 507 return self.mock_returns_func(*args, **kw)
508 else:
509 return None
TypeError: new_init() takes exactly 1 argument (0 given)
但是,如果我从new_init中删除self参数:
def new_init():
print "NEW INIT"
实例化A类给出:
In [13]: a = A()
Called A.__init__()
NEW INIT
这让我觉得minimock对“自我”有局限性。
您是否知道在传递给minimock的方法的模拟版本中是否可以使用“self”?
答案 0 :(得分:2)
我真的不明白为什么你这样做,无论如何答案是你不应该直接打电话给A.__init__
:
>>> class A(object):
... def __init__(self):
... print('Old init - self' + str(self))
>>> def new_init(self):
... print('New init - self:' + str(self))
...
>>> A.__init__ = new_init
>>> A.__init__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method new_init() must be called with A instance as first argument (got nothing instead)
>>> A()
New init - self:<__main__.A object at 0x2446d90>
<__main__.A object at 0x2446d90>
minimock
库没有错。 __init__
意味着通过调用类来调用。如果你明确地调用它,那么你必须明确地传递一个实例作为第一个参数。
无论如何,我强烈建议你再考虑一下你在做什么,因为你不应该这样做。模拟应该用于模拟整个对象,而不仅仅是方法。
在你的情况下,我会模拟整个课程A
,而不仅仅是__init__
方法。
答案 1 :(得分:1)
您正在定义一个函数new_init
,self
作为类之外的参数。因此,您需要为该函数提供参数。你可能想在类中声明它,所以它是一个类方法。否则没有意义。有关如何使用self
的详细信息,请参阅this question。