【问题标题】:Docopt/Python, how to properly test a functionDocopt/Python,如何正确测试函数
【发布时间】:2021-01-15 16:12:18
【问题描述】:

谁能帮我运行这个测试。我用 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 函数并测试断言?

【问题讨论】:

    标签: python unit-testing python-unittest docopt


    【解决方案1】:

    问题是当你在find_store.py中运行这一行时:

    args = docopt(usage)
    

    Docopt 实际上会解析给程序的参数,如果它们与使用模式不匹配,那么它将打印帮助并退出。您可以使用 docopt 参数argv 覆盖系统中的参数。

    为了避免 docopt 在测试时打印帮助并退出,您需要捕获 DocoptExit 异常。我在下面添加了一个小 sn-p,它演示了这些事情:

    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.')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2022-10-22
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多