用于单元测试的 arg 解析的正确类结构

问题描述

我的脚本:

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_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),我重构了我的代码,以便 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")