【问题标题】:Assign a MagicMock instance to return_value of another MagicMock instance将一个 MagicMock 实例分配给另一个 MagicMock 实例的 return_value
【发布时间】:2018-03-22 06:43:39
【问题描述】:

我正在尝试模拟 MagicMock 实例函数的返回值,但结果与我预期的不同:

>>> f = mock.MagicMock() # => <MagicMock id='139903823124048'>
>>> g = mock.MagicMock() # => <MagicMock id='139903823522512'>
>>> f.goo.return_value = g 
>>> g                    # => <MagicMock name='mock.goo()' id='139903823522512'>

实例 g 没有改变但它的名字改变了? 当我尝试时:

>>> f.goo(1,2)
>>> g.zoo('a')
>>> f.goo(3,4)
>>> f.goo.assert_has_calls([call(1,2), call(3,4)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/lando/.local/lib/python2.7/site-packages/mock/mock.py", line 969, in assert_has_calls
    ), cause)
  File "/home/lando/.local/lib/python2.7/site-packages/six.py", line 737, in raise_from
    raise value
AssertionError: Calls not found.
Expected: [call(1, 2), call(3, 4)]
Actual: [call(1, 2), call().zoo('a'), call(3, 4)]

为什么g的调用会成为f.goo调用的一部分? 甚至:

>>> f.goo.call_args_list # => [call(1, 2), call(3, 4)]

【问题讨论】:

    标签: python unit-testing mocking magicmock


    【解决方案1】:

    这种行为不是很直观,但符合预期。 见-

    https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.assert_has_calls https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.mock_calls

    在 mock_calls 中也会跟踪对返回值的调用。

    使用any_order 标志。

    【讨论】:

    • 因此,mock 以递归方式简单地跟踪对自身的所有调用以及它的方法调用和属性(根据 method_calls)。并且对 return_value 的分配可以被视为对分层调用的“分支”之一的附件。这就是我的理解。对于 f.goo,调用不是连续的,所以我几乎不能使用 any_order 标志。 Anw,感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多