最近,我发现模块在Python中是单例。这很好,因为在某些情况下,这种模式很有用。
就个人而言,我喜欢在各地共享的模块中使用它,比如选项。
例如,这是一个使用argparse的非常简单的选项模块:
#options.py
import argparse
parser = argparse.ArgumentParser(prog='myoptions')
parser.add_argument('-c', action='store')
options = parser.parse_args()
每当我import options
时,代码执行一次,变量options
包含解析的所有选项。很棒!
除了现在,我想测试一下。但是我编写它的方式使它很难测试它:
options
不起作用。我可以通过在函数中包含parse_args
调用并在每个单元测试中调用此函数来快速解决此问题。但是,在我的“真实”代码中,每当我需要一个选项时,我将必须导入options模块,然后执行“wrap function”,它将解析参数并给我选项。
这是可行的,但它并不漂亮,因为:
argv
的解析,而正常情况下,它应执行一次。那么,我如何使这个代码既可以单元测试又易于使用?
感谢您的帮助!
答案 0 :(得分:0)
经过一番研究后,似乎没有明显的解决方案。
在所有可能性中,我决定在解析变量时放置一个小if
:
if os.environ.get('UNITTEST', 0):
options = None
else:
options = _parser.parse_args()
然后,我在unittest文件中提供env变量UNITTEST=1
并在单元测试函数中进行解析。这允许我手动提供parse_args
来测试我的选项,当程序执行时,选项会立即被解析。