Python基类上的NotImplentedError

问题描述 投票:-1回答:1

我想知道这是否是一种好的做法,您将如何对其进行测试:

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. 也许这是可以使用抽象基类的示例,但是我认为尝试测试时也会遇到类似的问题。

python testing inheritance abstract-class
1个回答
0
投票

是的,使用基类进行的控制反转通常可以很好地提供便捷的API。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.