python - 模拟范围超出当前测试

标签 python mocking

我正在模拟一个模块...这是我的示例代码

def test_validate(self):
    """Test Base Retriever Dataframe"""

    sampleQuoteClass = self.sampleQuoteClass('ThisQuote')

    bRet._getAsOfData = MagicMock(return_value=sampleQuoteClass)

    dataAsDataFrame = bVal.validate(metaDataName='MyNewQuote')
    self.assertTrue(len(dataAsDataFrame) > 0)

这工作正常。

问题是 - bRet._getAsOfData 也被模拟用于下一个测试,它顺便驻留在其他测试类中。

只有当所有测试作为集合的一部分一起运行时才会出现此问题。

最佳答案

听起来你可能想要 patch对象而不是直接模拟它。您可能需要稍微调整我的示例以适合您的代码,但请尝试如下操作:

from mock import patch

def test_validate(self):
    """Test Base Retriever Dataframe"""

    sampleQuoteClass = self.sampleQuoteClass('ThisQuote')

    with patch('__main__.bRet') as mock_bRet:
        mock_bRet._getAsOfData.return_value = sampleQuoteClass

        dataAsDataFrame = bVal.validate(metaDataName='MyNewQuote')
        self.assertTrue(len(dataAsDataFrame) > 0)

当您修补对象时,模拟将被撤消,一旦 with block 退出,对象将“恢复正常”,因此模拟状态不会转移到您的其他测试。也可以将 patch 用作装饰器,但我一直更喜欢将它用作上下文管理器。有关每种用法的示例,请参阅上面链接的文档。

此外,根据我的经验,打补丁可能很棘手,所以我建议您阅读 this useful bit of documentation on "where to patch"以及。

关于python - 模拟范围超出当前测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41188982/

相关文章:

python - PySide 在线程之间发出 None 时使 Python 崩溃

python - 无法在python中导入模块

python - 将整数拆分为数字以计算 ISBN 校验和

Python mysql动态添加列并更新新列中的值

python - patch.multiple() 返回一个空字典

java - 如何测试该方法已添加 redirectAttributes ?(通过 MockMvc)

android - 如何在 Android Emulator Camera 中模拟图片?

c# - 起订量/结构图基础知识

Python opencv imwrite 不会将图像保存到目的地

python - 是否可以在多处理中运行 `mock.patch` 函数(使用 `spawn` )?