exec python 脚本和模拟缺失模块

exec python script and mock missing modules

我是 运行 python 脚本上的 execfile() 但在这个脚本中有对我没有的模块的调用。因此,我想用 fakeObject/mock

替换它们

我有这个指令:

import mymodule.mtest.core as CCORE
API = CCORE.object()
API.initialize(sys.argv, comm=comm)

但是我没有mymodule.mtest.core,我想用一个假对象替换CCORE.object() 包含 initialize() 方法

我试过这样的:

sys.modules['mymodule'] = MyfakeObj

MyFakeObj 是一个带有假 def initialiaze() 方法的 python 模块

但是我有这个错误

ModuleNotFoundError: No module named 'mymodule.mtest'; 'mymodule' is not a package

我该怎么做?

您可以使用 unittest.mock patch/mock 个对象。但是因为 unittest 是为了测试目的而创建的,我真的不确定你是否应该使用它。

from unittest.mock import Mock, patch

with patch("mymodule.mtest.core"):
    execfile() # What you want to run

如果您想从 mymodule.mtest.core 属性或方法中获取自定义值:

from unittest.mock import Mock, patch

with patch("mymodule.mtest.core") as mocked_function:
    mocked_function = Mock()
    mocked_function.some_attribute= "something"
    mocked_function.some_method = Mock(return_value="something")
    execfile() # What you want to run

感谢您的帮助。我测试了你的建议,但在我的上下文中,说明

ith patch.object(mymodule.mtest.core, "object", return_value=Mock()): 

不起作用,

另一方面,它让我走上了使用 Mock()

的轨道

我是这样使用的:

sys.modules['mymodule'] = MagicMock()
sys.modules['mymodule.mtest'] = MagicMock()
sys.modules['mymodule.mtest.core'] = MagicMock()

我可以按照说明执行我的脚本

import mymodule.mtest.core 

导入不再崩溃