Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试单例选项模块_Python_Unit Testing_Singleton - Fatal编程技术网

Python 测试单例选项模块

Python 测试单例选项模块,python,unit-testing,singleton,Python,Unit Testing,Singleton,最近,我发现Python中的模块是单例的。这很好,因为在某些情况下,这种模式很有用 就个人而言,我喜欢在到处共享的模块中使用它,比如选项 例如,下面是一个使用argparse的非常简单的选项模块: #options.py import argparse parser = argparse.ArgumentParser(prog='myoptions') parser.add_argument('-c', action='store') options = parser.parse_args()

最近,我发现Python中的模块是单例的。这很好,因为在某些情况下,这种模式很有用

就个人而言,我喜欢在到处共享的模块中使用它,比如选项

例如,下面是一个使用argparse的非常简单的选项模块:

#options.py
import argparse

parser = argparse.ArgumentParser(prog='myoptions')
parser.add_argument('-c', action='store')
options = parser.parse_args()
每当我导入选项时,代码执行一次,变量
options
包含所有解析的选项。太好了

除了现在,我想测试一下。但我编写代码的方式使得测试非常困难:

  • 当我在测试文件中导入模块时,argparse尝试解析argv,但它失败了,因为argv是来自unittest的
  • 因为它只被加载和执行一次,所以我只能测试选项模块的一部分。多次导入
    选项
    无效
通过将
parse_args
调用包装到函数中并在每个单元测试中调用该函数,我可以很快地解决这个问题。但是,在我的“real”代码中,每当我需要一个选项时,我都必须导入options模块,然后执行“wrap函数”,该函数将解析参数并为我提供选项

这是可行的,但并不漂亮,因为:

  • 我必须在任何需要选项的模块中导入并调用“parse”函数
  • 它将每次执行
    argv
    的解析,而正常情况下,它应该执行一次
那么,我如何使这段代码既可以进行单元测试又易于使用呢


谢谢你的帮助

经过一点研究,似乎没有明显的解决办法

在所有的可能性中,我决定在变量的解析中加入一个小的
if

if os.environ.get('UNITTEST', 0):
    options = None
else:
    options = _parser.parse_args()

然后,我在UNITTEST文件中输入一个env vars
UNITTEST=1
,并在单元测试函数中进行解析。这允许我手动输入
parse_args
来测试我的选项,当程序执行时,选项会立即被解析。

很抱歉,可能是重复的,但这不是重复,至少不是直接的。如果更改sys.argv,它将工作,但仅用于一个测试,因为代码导入/执行一次。我知道是因为我试过:)