首页 > 解决方案 > Python中基类的NotImplentedError

问题描述

我想知道这是否是一种好习惯以及您将如何对其进行测试:

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在每个子类中测试该方法,或者选择其中一个,从而破坏测试中的所有对称性。也许为该类实现一个虚拟process_me方法Base并发出警告?

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

标签: pythontestinginheritanceabstract-class

解决方案


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

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

2) 是的,在这种情况下完全使用@abstractmethodover 。NotImplemented


推荐阅读