首页 > 解决方案 > 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 函数并测试断言?

标签: pythonunit-testingpython-unittestdocopt

解决方案


问题是,当您在以下位置运行此行时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.')

推荐阅读