【问题标题】:NotImplentedError on Base classes in PythonPython中基类的NotImplementedError
【发布时间】:2020-04-05 13:51:30
【问题描述】:

我想知道这是否是一种好的做法以及您将如何测试它:

class Base(object):
    def __init__(self):
        self.total = 0

    def process_me(self, value: float):
        raise NotImplementedError

    def process_many(self, values: List[float]):
        for val in values:
            self.process_me(val)


class Sum(Base):
    def process_me(self, value: float):
        self.total += value


class Product(Base):
    def process_me(self, value: float):
        self.total *= value

这看起来不错,只写了子类SumProduct的重要方法。但是,我发现开发此代码有两个问题:

  1. 真的很难测试!最终,您必须在每个子类中测试process_many 方法,或者选择其中一个,从而破坏测试中的所有对称性。也许为Base 类实现一个虚拟的process_me 方法并引发警告?

  2. 也许这是一个可以使用抽象基类的例子,但是我想我在尝试测试时会遇到类似的问题。

【问题讨论】:

    标签: python testing inheritance abstract-class


    【解决方案1】:

    是的,使用基类进行控制反转通常非常适合提供方便的 API。

    1) 由于您通常应该以 100% 的测试覆盖率为目标,因此我认为创建这些类中的每一个的实例并断言它们的预期行为并没有什么大问题。真正的问题在哪里?我想也许你的例子有点过于简单,无法说明发生了什么。 如果您担心大型的样板式测试用例,您可以使用声明性模型,在其中定义您的类和预期结果在 dicts 列表(或您的测试库提供的任何参数化机制)并动态实例化它们。

    2) 是的,在这种情况下完全使用@abstractmethod 而不是NotImplemented

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多