python - 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
这看起来还不错,只为子类Sum
和Product
. 但是,我发现开发此代码有两个问题:
真的很难测试!最终,您必须
process_many
在每个子类中测试该方法,或者选择其中一个,从而破坏测试中的所有对称性。也许为该类实现一个虚拟process_me
方法Base
并发出警告?也许这是一个可以使用抽象基类的例子,但是我想我在尝试测试时会遇到类似的问题。
解决方案
是的,使用基类的控制反转通常非常适合提供方便的 API。
1) 由于您通常应该以 100% 的测试覆盖率为目标,因此我认为创建这些类中的每一个的实例并断言它们的预期行为并没有什么大问题。真正的问题在哪里?我想也许你的例子有点过于简单,无法说明发生了什么。如果您担心大型的样板式测试用例,您可以使用声明性模型,在其中定义您的类和预期结果列表中的字典(或您的测试库提供的任何参数化机制)并动态实例化它们。
2) 是的,在这种情况下完全使用@abstractmethod
over 。NotImplemented
推荐阅读
- html - 如何动态改变 UI Chip 的大小
- c - 我怎样才能更正我的代码?我的代码的主要目标是从另一个字符串初始化新字符串,只需复制 C 中的 n 个首字母
- python - 这是什么意思?“在 x += 1 中, x 只被评估一次。”
- android - 为什么我在 android 11 上的一些 .so 文件会因 segv_maperr 而崩溃?
- arrays - 在PowerShell中创建多个值哈希表
- c - 警告:'struct task_struct'“在此定义或声明之外,在参数列表中声明的将不可见”
- python - 如何在 Apriori 算法中找到最小支持?
- reactjs - 反应表列隐藏
- rocketmq - rg.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException:sendDefaultImpl 调用超时
- bash - 如何在没有 Docker 的情况下验证 Docker 登录?