2017-07-17 8 views
0

Pythonモックフレームワークを使用してクラス関数をモックしようとしているときに、TypeErrorが2つの引数(0が指定されています)Pythonモックフレームワークを使ってモックしている間にタイプエラーが発生しました

>>> class ExampleClass(): 
...  @staticmethod 
...  def _process_updates(arg1, arg2): 
...   pass 
... 
>>> 
>>> @patch("ExampleClass._process_updates") 
... def process_updates(arg1, arg2): 
... return "test" 
... 
>>> ExampleClass._process_updates() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: _process_updates() takes exactly 2 arguments (0 given) 
>>> 
+0

どのように2番目のスニペットを実行していますか?パッチデコレータは、装飾するメソッド内にのみ適用されます。 '_process_updates'を呼び出すと、パッチはアクティブではなく、元のメソッドが使用されます。 –

+0

デコレータが送信する 'MagicMock'の' process_updates'に2番目の引数がありません。 – Grimmy

+0

@DanielRosemanこのコードはすべてpythonコンソールで定義されています。 2番目のスニペットは、同じPythonコンソールから実行され、上記のコードはすでに書かれています。 – user2819403

答えて

0

@DanielRosemanが言ったように、関数(メソッド)のため@patch代替関数そのパッチによってを使用します。つまり、次の例では、calling_func_with_mockcalling_funcprocess_updates_process_updates(ローカルExampleClassオブジェクト内)に置換したため、パッチ適用されたバージョンのcalling_funcです。

という高いレベルの機能にパッチを当てることが重要だと思います。ExampleClassを使用してください。 HTH

from unittest.mock import patch 

class ExampleClass(): 
    @staticmethod 
    def _process_updates(arg1, arg2): 
     return arg1 

def patched_process_updates(arg1, arg2): 
    return arg2 

def calling_func(): 
    """Uses normal ExampleClass._process_updates""" 
    print(ExampleClass._process_updates('Hello','world')) 

@patch('__main__.ExampleClass._process_updates', new=patched_process_updates) 
def calling_func_with_mock(): 
    """Uses ExampleClass._process_updates patch""" 
    print(ExampleClass._process_updates('Hello','world')) 

if __name__=='__main__': 
    calling_func() 
    # 'Hello' 
    calling_func_with_mock() 
    # 'world' 
関連する問題