Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python arg parse和unittests的正确类结构_Python_Python Unittest_Args - Fatal编程技术网

Python arg parse和unittests的正确类结构

Python arg parse和unittests的正确类结构,python,python-unittest,args,Python,Python Unittest,Args,我的剧本: class Pivot: def __init__(self): self.args = self.parse_args() self.path = os.getcwd() self.file = self.args.filename if self.args.delimiter: self.delimiter = self.args.delimiter else:

我的剧本:

class Pivot:
    def __init__(self):
        self.args = self.parse_args()

        self.path = os.getcwd()
        self.file = self.args.filename

        if self.args.delimiter:
            self.delimiter = self.args.delimiter
        else:
            self.delimiter = ";"


    def parse_args(self):
        parser = argparse.ArgumentParser(prog="TBD",
                                     description="TBD")

        parser.add_argument("-f", "--filename", help="blahblah")
        parser.add_argument("-d", "--delimiter", help="blahblah")
        args = parser.parse_args()

        return args

if __name__ == "__main__":
    p = Pivot()
和我当前的test.py:

class TestPivot(unittest.TestCase):
    def setUp(self):
        self.pivot = Pivot()

    def tearDown(self):
        pass

    
    def test_parse_args(self):
        parsed = self.parser.parse_args(['-f', 'test'])
        self.assertEqual(parsed.something, 'test')


    def test_minimal(self):
        """To make sure at least a test is passed"""
        self.assertEqual("neo".upper(), "NEO")
然后,当我运行python3-m unittest tests/test\u Pivot.py时,我得到:

E
usage: Pivot table representation [-h] [-f FILENAME] [-d DELIMITER]
Pivot table representation: error: unrecognized arguments: tests/test_Pivot.py
E
======================================================================
ERROR: test_create_pivot (tests.test_Pivot.Pivot)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Project/tests/test_Pivot.py", line 21, in setUp
    self.pivot = Pivot()
  File "/Project/Pivot.py", line 25, in __init__
    self.args = self.parse_args()
  File "/Project/Pivot.py", line 42, in parse_args
    args = parser.parse_args()
在处理argparse时,我的类是否应该进行不同的重组,如果是,如何重组?目前,我甚至无法运行简单的测试,因为类是如何实例化的。

感谢您的建议(@MrBean Bremen),我重构了我的代码,因此
解析参数现在位于我的类之外:

def parse_args(args):
    parser = argparse.ArgumentParser(prog="blah",
                                     description="blah")

    parser.add_argument("-f", "--filename", help="blah")
    parser.add_argument("-d", "--delimiter", help="blah")

    return parser.parse_args(args)

class Pivot:
    def __init__(self, args):
        self.path = os.getcwd()
        self.file = args.filename

        if args.delimiter:
            self.delimiter = args.delimiter
        else:
            self.delimiter = ";"


if __name__ == "__main__":
    args = parse_args(sys.argv[1:])
    p = Pivot(args)
然后我的测试变成:

class TestPivot(unittest.TestCase):
    def setUp(self):
        args = parse_args(["-f", "test1", "-d", ","])
        self.pivot = Pivot(args)

    def test_init(self):
        self.assertEqual(self.pivot.file, "test1")
        self.assertEqual(self.pivot.delimiter, ",")

    def test_parse_args(self):
        parsed = parse_args(["-f", "test2"])
        self.assertEqual(parsed.filename, "test2")
        self.assertNotEqual(parsed.filename, "test3")
感谢您的建议(@MrBean Bremen),我重构了我的代码,因此
parse_args
现在位于我的类之外:

def parse_args(args):
    parser = argparse.ArgumentParser(prog="blah",
                                     description="blah")

    parser.add_argument("-f", "--filename", help="blah")
    parser.add_argument("-d", "--delimiter", help="blah")

    return parser.parse_args(args)

class Pivot:
    def __init__(self, args):
        self.path = os.getcwd()
        self.file = args.filename

        if args.delimiter:
            self.delimiter = args.delimiter
        else:
            self.delimiter = ";"


if __name__ == "__main__":
    args = parse_args(sys.argv[1:])
    p = Pivot(args)
然后我的测试变成:

class TestPivot(unittest.TestCase):
    def setUp(self):
        args = parse_args(["-f", "test1", "-d", ","])
        self.pivot = Pivot(args)

    def test_init(self):
        self.assertEqual(self.pivot.file, "test1")
        self.assertEqual(self.pivot.delimiter, ",")

    def test_parse_args(self):
        parsed = parse_args(["-f", "test2"])
        self.assertEqual(parsed.filename, "test2")
        self.assertNotEqual(parsed.filename, "test3")

尝试将argparsing部分与实际业务逻辑分开。您可以将解析放在一个单独的函数中(我用来调用它
main()
),并在
\uuuu init\uuu
中将参数提供给您的类。然后,您可以独立于参数解析来测试您的逻辑。@Bean Breme先生:您的意思是作为类之外的单独函数吗?是的,完全正确。如果愿意,也可以将其作为静态函数添加到类中,但在语义上是相同的。您通常不需要测试解析本身,因为它是由
argparse
完成的。请尝试将argparsing部分与实际业务逻辑分开。您可以将解析放在一个单独的函数中(我用来调用它
main()
),并在
\uuuu init\uuu
中将参数提供给您的类。然后,您可以独立于参数解析来测试您的逻辑。@Bean Breme先生:您的意思是作为类之外的单独函数吗?是的,完全正确。如果愿意,也可以将其作为静态函数添加到类中,但在语义上是相同的。您通常不需要测试解析本身,因为它是由
argparse
完成的。