如何在Python中将对象注入到另一个命名空间中?

2024-05-23 22:04:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为办公室里其他人写的代码写一些单元测试。Python不是我最擅长的语言。虽然我已经成功地完成了基本单元测试,但是python中的mocking让我陷入了一个循环。在

我需要做的是重写对ConfigObj的调用,并将我自己的模拟config/fixture注入到任何ConfigObj调用中。在

在设置.py在

from configobj import ConfigObj
config = ConfigObj('/etc/myapp/config')

在实用工具.py在

^{pr2}$

我想做的是,在我的单元测试中实用工具.py,对ConfigObj或设置.py本身。在

许多mocking库希望我模仿自己的类,但是在这个应用程序中,它没有任何显式的类。在

可以这样做吗?还是python名称空间的限制太严格,以至于我无法干预要导入的模块本身是什么?在

旁注:运行2.7,所以我不能做我从2.5中读到的任何技巧。在


Tags: 代码frompyimport语言configetc实用工具
3条回答

如果测试在来自settings.pyutils.py的单独文件中,则可以创建一个文件mock.py

import configobj

class MockConfigObj(object):
     #mock whatever you wan

configobj.ConfigObj = MockConfigObj

然后import mock,然后导入(从)任何本身导入的模块settings。这将确保使用MockConfigObj创建{}。如果需要统一的全局模拟,请在导入configobj的任何文件之前导入它。在

这是因为python将configobj存储在sys.modules中,并在实际读取后续导入的文件之前进行检查。在mock.py中,标识符ConfigObj只是对sys.modules中条目的引用,因此您所做的任何更改都将是全局可见的。在

这让我觉得有点老套,但这是我能想到的最好的。在

Python名称空间在同一范围内根本不严格。只需重写包含对象(或类本身并提供它)的变量名,在您期望的原始范围内就足够了。在

现在,你要替换它的行为是否相同取决于你。。。在

你不能用另一个重写原来的函数吗?在

Python中没有常量,您可以更改所有内容,甚至可以执行True = False。在

相关问题 更多 >