重新导入被测模块以丢失上下文
Posted
技术标签:
【中文标题】重新导入被测模块以丢失上下文【英文标题】:re-import module-under-test to lose context 【发布时间】:2011-11-19 14:17:39 【问题描述】:许多 Python 模块在不定义类的情况下保留内部状态,例如logging
维护着多个可通过 getLogger()
访问的记录器。
您如何测试这样的模块?使用标准的 unittest
工具,我希望 TestCase
类中的各种测试重新导入我的模块-under-测试,以便每次它失去其上下文。这个可以吗?
【问题讨论】:
除了重新导入模块,这在某些情况下可能是必要的,如果你正在重置的状态很好地包含在模块的一个或几个属性中,你可以使用mock.patch
将它们模拟出来,然后将模拟替换为其他测试。
【参考方案1】:
import unittest
import sys
class Test(unittest.TestCase):
def tearDown(self):
try:
del sys.modules['logging']
except KeyError:
pass
def test_logging(self):
import logging
logging.foo=1
def test_logging2(self):
import logging
print(logging.foo)
if __name__ == '__main__':
unittest.sys.argv.insert(1,'--verbose')
unittest.main(argv = unittest.sys.argv)
% test.py Test.test_logging
通过:
test_logging (__main__.Test) ... ok
但是
% test.py Test.test_logging2
没有:
test_logging2 (__main__.Test) ... ERROR
因为logging
的内部状态已被重置。
【讨论】:
【参考方案2】:这将为您重新导入新模块:
import sys
del sys.modules['my_module']
import my_module
【讨论】:
我想你的意思是del sys.modules['my_module']
以上是关于重新导入被测模块以丢失上下文的主要内容,如果未能解决你的问题,请参考以下文章
错误:尚未正确初始化 Azure PowerShell 上下文。请导入模块并重试