我想知道这是否是一种好的做法,您将如何对其进行测试:
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
这看起来不错,只为子类Sum
和Product
编写了重要的方法。但是,我发现开发此代码有两个问题:
这真的很难测试!最终,您必须在每个子类中测试process_many
方法,或者选择其中一个,破坏测试中的所有对称性。也许为process_me
类实现虚拟Base
方法并引发警告?
也许这是可以使用抽象基类的示例,但是我认为尝试测试时也会遇到类似的问题。
是的,使用基类进行的控制反转通常可以很好地提供便捷的API。
1)由于您通常应该争取100%的测试覆盖率,因此在创建这些类中的每个类的实例并声明其预期行为方面,我没有看到太大的问题。真正的问题在哪里?我想也许您的示例有点过于简单了,无法说明发生了什么。如果您担心大型的样例测试用例,则可以使用声明式模型,在该模型中,在dict列表(或测试库提供的任何参数化机制)中定义类和预期结果,并动态实例化它们。
2)是,在这种情况下,请完全使用@abstractmethod
而不是NotImplemented
。