Python:如何有效地对调用OptionParser的方法进行单元测试?

Python:如何有效地对调用OptionParser的方法进行单元测试?,python,unit-testing,testing,mocking,optionparser,Python,Unit Testing,Testing,Mocking,Optionparser,在我的Python单元测试(通过标准的nosetests/unittest.TestCase)中,我有一个类,在这个类中我创建了一个进行选项解析的方法。我想写一个很好的单元测试例程来很好地进行测试 除此之外,下面还有4个问题,我正在寻找实现这一点的最佳方法 from optparse import OptionParser class Something(object): def getOptionParser(self): return OptionParser()

在我的Python单元测试(通过标准的nosetests/unittest.TestCase)中,我有一个类,在这个类中我创建了一个进行选项解析的方法。我想写一个很好的单元测试例程来很好地进行测试

除此之外,下面还有4个问题,我正在寻找实现这一点的最佳方法

from optparse import OptionParser

class Something(object):

    def getOptionParser(self):
        return OptionParser()

    def parseMyOptions(self):
        parser = self.getOptionParser()
        parser.add_option('--debug',    action='store_true', help='Run debug mode.')
        parser.add_option('--logfile',  default='log/logfile.log', help='what filename')
        parser.add_option('--url',      type='string', help='desired url')
        (options, args) = parser.parse_args()
        self.debug          = options.debug
        self.logfile        = options.logfile
        self.url            = options.url

    def main(self):
        self.parseMyOptions()

class MockOptionParser(object):
      def __init__(self):
          self.url = None
          self.debug = None
          self.logfile = None
      def add_option(self, *args, action=None, help=None, default=None):
          pass
      def parse_args(self):
          pass
      def error(self):
          pass

class TestSomething(unittest.TestCase):
    def test_something(self):
        s = Something()
        s.getOptionParser = MockOptionParser()
        s.parseMyOptions()
        assert True, "assert something useful?"
因此,这里的问题是:

  • 我能断言什么有用的东西

  • 如何在不复制OptionParser框架的情况下自动生成MockOptionParser

  • 注意,在MockOptionParser的add_选项中,我不处理'type'关键字,但我应该处理。我确信我不会预测OptionParser使用的所有方法和关键字参数,并在MockOptionParser中实现它们有更简单的方法吗?

  • 为每个选项初始化带有自变量的MockOptionParser很难看。有什么方法可以很好地做到这一点吗

  • 是否有一种简单的方法来验证所有add_option()变量(例如options.debug)是否用于设置self.debug之类的内容


  • 你从MockOptionParser中得到了什么?它还能做其他事情吗?从我所看到的,您在这里所做的只是测试mock对象,这似乎有些徒劳。在python3中,您可以使用
    unittest.mock
    来避免手动定义
    MockOptionParser
    。如果您使用的是python2,那么可以从PyPI下载模块。无论如何,我认为您应该更专注于测试程序的逻辑,而不是检查您是否正确使用了
    OptionParser