【问题标题】:Python - mock imported dictionaryPython - 模拟导入字典
【发布时间】:2017-12-04 23:41:25
【问题描述】:

在我要测试的代码的顶部,我有一个类似的导入:

from resources import RESOURCES

其中RESOURCES 是值字典。

如何在测试中模拟它?

我想要的是,无论真实模块中有什么,都返回一个众所周知的字典。

例如,在一项测试中,我希望 RESOURCES 成为:

{
  'foo': 'bar'
}

在另一个测试中,我希望它是:

{
  'something': 'else'
}

【问题讨论】:

  • “模拟”到底是什么意思?
  • 你需要如何“模拟”它。是否需要测试模块是否存在,是否需要伪造模块是否存在?您只需要RESOURCES 定义,还是需要sys.modules 中的虚假条目?
  • 您可以添加一个本地(即同一目录)模块resources.py,其中包含您的模拟RESOURCES 字典。或者,您可以将该模块放在其他位置,并将相应的路径添加到 sys.path:sys.path.insert(0, '/path/to/resources/')
  • 没有任何方法可以通过unittest.mock实现它?

标签: python unit-testing dictionary mocking patch


【解决方案1】:

我到patch RESOURCE 对象的方式是使用:

from default import RESOURCES
from mock import patch

with patch.dict(RESOURCES, {'foo': 'bar'}, clear=True):
    assert(RESOUCES['foo'], 'bar')

请注意,您需要在测试套件中导入要修补的字典

也可以使用装饰器语法:

from default import RESOURCES
from mock import patch

@patch.dict(RESOURCES, {'foo': 'bar'}, clear=True)
def test(self):
    self.assert(RESOUCES['foo'], 'bar')

【讨论】:

  • 这会泄露给其他测试用例。谨慎使用。
【解决方案2】:

看看unittest.mock.patch.object。我认为它将满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2016-01-23
    • 1970-01-01
    • 2020-06-11
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多