如何解决如何在单元测试中使用 argparse 参数调用函数?
请帮我写单元测试:
我有一个带有一个函数的简单程序,当运行带有 argparse 参数 --double
的程序时,它只返回双倍的“name”。否则返回单个名称
# code.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument('-d','--double',action="store_true")
args = parser.parse_args()
def double_name(new_name):
if args.double:
return new_name + new_name
else:
return new_name
print(double_name(args.name))
- 在 cmd
python code.py test-name
中运行我有一个结果:test-name
- 在 cmd
python code.py test-name -d
中运行我有一个结果:test-nametest-name
我想编写unittest来检查这个函数,但是我不知道如何在单元测试中使用argparse参数调用这个函数。
# test_code.py
import unittest
import code
class Test_Code(unittest.TestCase):
def test_double_name(self):
# without -d
self.assertEqual(code.double_name('test-name'),'test-name')
# with -d
self.assertEqual(code.double_name('test-name'),'test-nametest-name')
if __name__ == "__main__":
unittest.main()
code.args = code.parser.parse_args(["test-name","-d"])
标准命令 python -m unittest test_code.py
引发 AttributeError
AttributeError: 'module' 对象没有属性 'py'
解决方法
在函数外做解析数据的访问,把数据传入。那么数据从哪里来就无所谓了:
def double_name(new_name,double):
if double:
return new_name + new_name
else:
return new_name
print(double_name(args.name,args.double))
那么:
self.assertEqual(code.double_name('test-name',False),'test-name')
,
您可以使用自己的参数列表调用 parse_args
,让它产生一个合适的值来使用。这需要稍微重写 code
以避免在导入时调用 parse_arg
:
# code.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument('-d','--double',action="store_true")
def double_name(new_name):
if args.double:
return new_name + new_name
else:
return new_name
if __name__ == "__main__":
args = parser.parse_args()
print(double_name(args.name))
然后
# test_code.py
import unittest
import code
class Test_Code(unittest.TestCase):
def test_double_name(self):
code.args = code.parser.parse_args([])
self.assertEqual(code.double_name('test-name'),'test-name')
code.args = code.parser.parse_args(["-d"])
self.assertEqual(code.double_name('test-name'),'test-nametest-name')
if __name__ == "__main__":
unittest.main()
在您的测试函数中,您需要确保设置了 code.args
的值,因为这是 code.double_name
使用的变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。