如果你想在你的单元测试之前做一个快速修复的修复,那么不需要困难的操作。
如果单元测试与您要测试的代码位于同一文件中,只需从globals()
字典中删除不需要的模块即可。
这是一个相当长的例子:假设你有一个模块impp.py
与内容:
value = 5
现在,在您的测试文件,你可以这样写:
>>> import impp
>>> print globals().keys()
>>> def printVal():
>>> print impp.value
['printVal', '__builtins__', '__file__', 'impp', '__name__', '__doc__']
注意impp
是其中全局变量,因为它是导入的。调用使用impp
模块还是功能printVal
工作:
>>> printVal()
5
但现在,如果您从globals()
impp
关键...
>>> del globals()['impp']
>>> print globals().keys()
['printVal', '__builtins__', '__file__', '__name__', '__doc__']
...并尝试调用printVal()
,你会得到:
>>> printVal()
Traceback (most recent call last):
File "test_imp.py", line 13, in <module>
printVal()
File "test_imp.py", line 5, in printVal
print impp.value
NameError: global name 'impp' is not defined
......这可能正是你想要实现的。
要在单元测试中使用它,可以在运行测试套件之前删除全局变量,例如,在__main__
:
if __name__ == '__main__':
del globals()['impp']
unittest.main()
您希望在mock_import方法中添加`try:finally:`,以避免在出错时使用包装导入而不是默认导入。 – Yonatan 2013-02-19 08:37:02