首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python MagicMock属性是静态的。

Python MagicMock属性是静态的。
EN

Stack Overflow用户
提问于 2017-07-20 12:03:02
回答 1查看 259关注 0票数 1

考虑到我必须对以下功能进行单元测试:

代码语言:javascript
复制
def f(A):
    tasks = []

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

        tasks.append(task)

    return tasks

当我模拟A函数的f参数时,会发生这样的情况:

代码语言:javascript
复制
>>> A = mock.MagicMock()
>>> tasks = f(A)

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

Out: 2 2 2

我期望得到以下输出:0 1 2,为什么要得到它,以及如何解决这个问题?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-20 12:31:33

既然AMagicMockA.tasksA.tasks.create也是。当调用最后一个实例时,它总是返回对同一个MagicMock实例的引用,因此task.attr = i覆盖相同MagicMockattr属性。tasks是对同一个MagicMock实例的三个引用的列表。

代码语言:javascript
复制
>>> 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属性:

代码语言:javascript
复制
>>> A = mock.MagicMock()
>>> A.tasks.create = mock.MagicMock
>>> A.task.create()
<MagicMock id='4485133648'>
>>> A.task.create()
<MagicMock id='4485176176'>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45214148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档