2013-01-22 3 views
0

파이썬에서 minimock 라이브러리를 사용하여 클래스의 __init__ 메소드를 조롱하고 싶습니다.미니ock의 모의 메소드에서 객체의 "self"에 액세스하는 방법

def new_init(): 
    print "NEW INIT" 

는 A 클래스주는 인스턴스화 :

In [13]: a = A() 
Called A.__init__() 
NEW INIT 
을 내가 new_init에서 자기 주장을 제거하면, 그러나

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) 

:

은 인터프리터 (ipython)하는 일이다

미니멈은 "자아"에 한계가 있다고 생각합니다.

minimock에 전달 된 메소드 조롱 된 버전에서 "self"를 사용할 수 있는지 알고 있습니까?

답변

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

마지막으로, 나는 minimock을 조롱하는 대신에'__init__' 메쏘드를 스스로 바 꾸었습니다. – GDICommander

1

new_initself과 함께 클래스 외부의 인수로 정의하고 있습니다. 그렇다면, 당신은 그 함수에 인수를 제공해야합니다. 클래스 내부에서 선언하기를 원하기 때문에 클래스 메소드입니다. 그렇지 않으면 의미가 없습니다. self의 사용 방법에 대한 자세한 내용은 this question을 참조하십시오. 난 정말 당신이 그 일을하는 이유를 이해하지 않습니다