【问题标题】:Python mock library not returning correct mock object for 'patch'Python 模拟库没有为“补丁”返回正确的模拟对象
【发布时间】:2023-03-24 04:03:01
【问题描述】:

我正在尝试让模拟库返回带有补丁的特定模拟对象。无论我尝试什么,如果我在“with”子句中实例化一个新对象,我会得到一个通用的 Mock 对象,而不是我自定义的对象。

这是我的代码,以日志记录为例:

    import logging

    my_mock = Mock()
    my_mock.id = 'i-12341234'

    with patch('logging.PlaceHolder', new=my_mock) as mockobj:
        print mockobj.id          # correctly prints 'i-12341234'

        newobj = logging.PlaceHolder(None)
        print newobj.id           # prints <Mock name='mock().id' id='47607184'>

每次实例化一个新的 logging.Placeholder 实例时,我如何才能让 mock 返回 my_mock?

事实证明,子类化 Mock 并使用 new_callable 传递它。由于我花时间尝试使上述版本正常工作,我仍然很感激并回答。

【问题讨论】:

标签: python


【解决方案1】:
import logging
from mock import Mock, patch

my_mock = Mock()
my_mock.id = 'i-12341234'

with patch('logging.PlaceHolder', new=my_mock) as mockobj:
    mockobj.return_value = mockobj # <-- added this line.
    print mockobj.id
    newobj = logging.PlaceHolder(None)
    print newobj.id

替代方案

import logging
from mock import Mock, patch

my_mock = Mock()
my_mock.id = 'i-12341234'
my_mock.return_value = my_mock # <---

with patch('logging.PlaceHolder', new=my_mock) as mockobj:
    assert mockobj.id == 'i-12341234'
    newobj = logging.PlaceHolder(None)
    assert newobj.id == 'i-12341234'

【讨论】:

  • 这与我的代码有何不同(除了导入 Mock 和补丁?)
  • @user1491250,您编写了补丁 loggin.PlaceHolder,但没有补丁 logging.PlaceHolder()
  • 肯定需要添加到文档中 :-) 谢谢
猜你喜欢
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多