首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在单元测试期间测试所需的How解析参数?

如何在单元测试期间测试所需的How解析参数?
EN

Stack Overflow用户
提问于 2019-07-05 10:13:44
回答 2查看 741关注 0票数 0

我正在为for解析器进行TDD测试。如何使用选项必需的测试参数?我需要测试所有选项,如:

  • 太多的争论,
  • 没有提出任何论据,
  • 提出了错误的论点。

我可以提高SystemExit,但这并不是我真正需要的:

代码语言:javascript
复制
    def test_no_arguments(self):
        with patch.object(sys, 'exit') as mock_method:
            self.parser.parse_arguments()
            self.assertTrue(mock_method.called)

然而,在没有引发系统退出的情况下,我总是会出现这样的错误:

zbx-check-mount.py

代码语言:javascript
复制
class CommandLine:
    def __init__(self):
        self.args_parser = argparse.ArgumentParser(description="Monitoring mounted filesystems",
                                                   formatter_class=argparse.RawTextHelpFormatter)
        self.parsed_args = None

        self.add_arguments()

    def add_arguments(self):
        """
        Add arguments to parser.
        """
        try:
            self.args_parser._action_groups.pop()  # pylint: disable=protected-access
            required = self.args_parser.add_argument_group('required arguments')
            required.add_argument('--fs_name', required=True, help='Given filesystem')
        except argparse.ArgumentError as err:
            log.error('argparse.ArgumentError: %s', err)
            sys.exit(1)

    def parse_arguments(self, args=None):
        """
        Parse added arguments. Then run private method to return values
        """
        self.parsed_args = self.args_parser.parse_args()

        return self.parsed_args.fs_name,

测试

代码语言:javascript
复制
from pyfakefs.fake_filesystem_unittest import TestCase
import os
import sys

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

if sys.version_info[0] == 3:
    from unittest.mock import MagicMock, patch
else:
    from mock import MagicMock, patch


sys.path.extend([os.path.join(os.path.dirname(os.path.abspath(__file__)),'..','..', "bin")])
module_name = __import__('zbx-check-mount')


class TestCommandLine(TestCase):

    def setUp(self):
        """
        Method called to prepare the test fixture. This is called immediately before calling the test method
        """
        self.parser = module_name.CommandLine()

    def test_no_arguments(self):
        opts = self.parser.parse_arguments([])
        assert opts.fs_name

    def tearDown(self):
        """
        Method called immediately after the test method has been called and the result recorded.
        """
        pass

如何避免这种情况并测试其他选项?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-05 16:20:02

def parse_arguments(self, args=None):中,您应该将args传递给解析器,如下所示:

代码语言:javascript
复制
self.args_parser.parse_args(args)

parse_args()解析sys.argv[1:],或者如果给定的参数是None。否则,它将解析提供的列表。

在完整的python发行版中,有一个用于argparse (test_argparse.py)的统一文件。这有点复杂,定义了一个捕获错误和重定向错误消息的ArgumentParser子类。

测试argparse很棘手,因为它查看sys.argv,而unittest脚本也使用。它通常会尝试在错误时退出。这已经在许多这样的问题中讨论过了。

票数 1
EN

Stack Overflow用户

发布于 2019-07-05 13:29:18

如果我正确地解释了您的症状,您就会在测试工具中遇到问题,因为您的sys.exit的猴子补丁实现实际上返回了are解析库所不期望的结果。

引入一个引发异常的效果,然后您可以在单元测试中捕获并验证该异常,这可能足以解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56901051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档