python - Docopt/Python,如何正确测试函数
问题描述
谁能帮我运行这个测试。我用 docopt 制作了一个简单的 python 应用程序。
我在 find_store.py 中有一个名为 find_by_zip 的函数
usage = '''
Store Finder CLI.
Usage:
find_store --address="<address>"
find_store --address="<address>" [--units=(mi|km)] [--output=text|json]
find_store --zip=<zip>
find_store --zip=<zip> [--units=(mi|km)] [--output=text|json]
'''
args = docopt(usage)
if args['--zip']:
zip = args['--zip']
units = args['--units'] or 'mi'
return_output = args['--output'] or 'text'
print(find_by_zip(zip, units, return_output))
find_by_zip(args):
# logic
我的测试文件看起来像
import unittest
from docopt import docopt
from find_store import find_by_zip
class FindByZipTest(unittest.TestCase):
def test_set_up(self):
"""TEST"""
find = find_by_zip('93922', 'mi', 'json')
print(find)
if __name__ == "__main__":
unittest.main()
当我运行 python3 test_find_store.py
结果是
Usage:
find_store --address="<address>"
find_store --address="<address>" [--units=(mi|km)] [--output=text|json]
find_store --zip=<zip>
find_store --zip=<zip> [--units=(mi|km)] [--output=text|json]
如何在 FindByZip 类中导入 find_by_zip 函数并测试断言?
解决方案
问题是,当您在以下位置运行此行时find_store.py
:
args = docopt(usage)
Docopt 实际上会解析给程序的参数,如果它们与使用模式不匹配,那么它将打印帮助并退出。您可以使用 docopt 参数argv
覆盖系统中的参数。
为了避免 docopt 在测试时打印帮助并退出,您需要捕获DocoptExit
异常。我在下面添加了一个小片段,它演示了这些事情:
from docopt import docopt, DocoptExit
usage = '''
Store Finder CLI.
Usage:
find_store --address="<address>"
find_store --address="<address>" [--units=(mi|km)] [--output=text|json]
find_store --zip=<zip>
find_store --zip=<zip> [--units=(mi|km)] [--output=text|json]
'''
test = ['--address="Some street 42"']
args = docopt(usage, argv=test)
print(args)
try:
args = docopt(usage, argv=['fails'])
except DocoptExit:
print('Not a valid usage pattern.')
推荐阅读
- ionic-framework - 使用 google 登录时出现错误“10”
- c# - 如何动态创建json?
- r - 否则如果循环没有产生正确的结果?
- vue.js - 如何在 Sails.js 中更新 Vue.js 依赖版本?
- javascript - 是否可以测试 .each(function()) 语句?
- json - 使用 jolt 复制 Json 数组元素
- http - 未处理的异常:FormatException:输入意外结束(在字符 1 处)
- jquery - 当所有子元素都不可见时隐藏父 HTML 内容
- javascript - 在 Javascript/JQuery 中使用自定义分隔符计算天数
- scala - 在 EMR Notebooks 中添加外部 jar