考虑到我必须对以下功能进行单元测试:
def f(A):
tasks = []
for i in range(0, 3):
task = A.tasks.create()
task.attr = i
tasks.append(task)
return tasks当我模拟A函数的f参数时,会发生这样的情况:
>>> A = mock.MagicMock()
>>> tasks = f(A)
>>> for task in tasks:
>>> print(task.attr)
Out: 2 2 2我期望得到以下输出:0 1 2,为什么要得到它,以及如何解决这个问题?谢谢。
发布于 2017-07-20 12:31:33
既然A是MagicMock,A.tasks和A.tasks.create也是。当调用最后一个实例时,它总是返回对同一个MagicMock实例的引用,因此task.attr = i覆盖相同MagicMock的attr属性。tasks是对同一个MagicMock实例的三个引用的列表。
>>> 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都是相同的。)
每次调用create时获得一个新的模拟任务的一种方法是显式地将MagicMock分配给tasks模拟的create属性:
>>> A = mock.MagicMock()
>>> A.tasks.create = mock.MagicMock
>>> A.task.create()
<MagicMock id='4485133648'>
>>> A.task.create()
<MagicMock id='4485176176'>https://stackoverflow.com/questions/45214148
复制相似问题