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

Pan*_*ngh 7 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)
Run Code Online (Sandbox Code Playgroud)

这工作正常。

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

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

ele*_*han 8

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

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)
Run Code Online (Sandbox Code Playgroud)

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

此外,根据我的经验,修补可能很棘手,因此我建议您也阅读有关“在哪里修补”的有用文档