2017-07-20 9 views
0

私はユニットテストに以下の機能を持たせて考えてみましょう静的なものである:私はf機能のA引数を模擬するとPythonのMagicMock属性は

def f(A): 
    tasks = [] 

    for i in range(0, 3): 
     task = A.tasks.create() 
     task.attr = i 

     tasks.append(task) 

    return tasks 

を、この問題が発生した:

>>> A = mock.MagicMock() 
>>> tasks = f(A) 

>>> for task in tasks: 
>>> print(task.attr) 

Out: 2 2 2 

は、私は次の出力が期待されます: 0 1 2、なぜ私はそれを取得し、どのように私はこれを解決することができますか?ありがとう。

答えて

0

AMagicMockなので、A.tasksA.tasks.createです。最後の呼び出し時には、と同じMagicMockインスタンスへの参照が返されるため、task.attr = iは、同じMagicMockattr属性を上書きします。 tasksは同じMagicMockインスタンスへの3つの参照のリストです。

>>> from unittest import mock 
>>> A = mock.MagicMock() 
>>> A.tasks.create() 
<MagicMock name='mock.task.create()' id='4486337536'> 
>>> A.tasks.create() 
<MagicMock name='mock.task.create()' id='4486337536'> 
>>> A.tasks.create() 
<MagicMock name='mock.task.create()' id='4486337536'> 

(idは3つのすべてのために同じであることに注意してください。)あなたはcreateを呼び出すたびに明示的tasksモックのcreate属性にMagicMockを割り当てることです新しいモックタスクを取得するための

一つの方法:

>>> A = mock.MagicMock() 
>>> A.tasks.create = mock.MagicMock 
>>> A.task.create() 
<MagicMock id='4485133648'> 
>>> A.task.create() 
<MagicMock id='4485176176'>