0

__init__Python で、minimock ライブラリを使用してクラスのメソッドをモックしたいと考えています。

これは、インタープリターが行うことです (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 に渡されるメソッドのモック バージョンで「self」を使用できるかどうか知っていますか?

4

2 に答える 2

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__

于 2013-01-22T16:57:26.430 に答える
1

クラス外で引数として関数new_initを定義しています。selfそのため、その関数に引数を指定する必要があります。おそらくクラス内で宣言したいので、クラスメソッドです。そうでなければ意味がありません。の使用方法の詳細については、この質問を参照してくださいself

于 2013-01-22T16:52:39.347 に答える