2013-06-19 161 views
4

我正在为Python模块module使用python的unittest框架编写单元测试。Python重载模块

该模块在加载时会使用json文件进行一些“预处理”,因此它具有以下功能: module.info['xyz']可以被访问和使用。

为此编写测试时,我想在每次测试之前重新加载模块,以便在开始当前测试之前,对于每个测试,字典module.info的旧键不再存在。

现在我有一个reload(module)setUp(),但这似乎并没有伎俩。我在后台执行了其他测试,例如test_Btest_C,其中的test_A引入了旧密钥。

我想知道是否有办法实现我想要实现的目标,或者如果您可以指向我说明无法完成的文档。

+0

请参阅这里的讨论 http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module –

+0

@MaximKhesin我已经通过了问题在发布这篇文章之前,您认为哪部分讨论能够解决我的问题? – ffledgling

回答

2

手动从sys.modules字典中删除模块似乎适用于我。

import sys 
import unittest 
import myModule 

class MyTest(unittest.TestCase): 
    def setUp(self): 
     global myModule 
     myModule = __import__('path.to.myModule', globals(), locals(), [''], -1) 
     return 

    def tearDown(self): 
     global myModule 
     del sys.modules[myModule.__name__] 
     return 
+0

@ffledgling:这是否适合你? – CivFan

+0

为什么你在'setUp()'中使用'__import __()',而不是再次使用'import myModule'?如果这是为了在全局名称空间中维护'myModule',是否有一种更简单的方法,不需要知道如何使用'__import __()'? – CivFan

+0

另外,'setUp'和'tearDown'的'return'调用是多余的。如果执行结束时没有触及'return'调用,则方法和函数有一个隐含的'return None'。 – CivFan