假设我有一个函数,它被记录为取collections.Sequence
ABC。如何针对ABC接口测试此函数中的代码?我可以编写一个单元测试(或多个测试)来确认我的代码只调用由ABC定义的方法,而不是由list
或collections.Sequence
的其他具体实现定义的方法吗?或者是否有其他工具或方法来验证这一点?
通过传递一个只实现这些方法的类的实例来测试函数。如果需要,可以将内置类型(如list
)子类化,并覆盖其__getattribute__方法,如下所示:
class TestSequence(list):
def __getattribute__(self, name):
if name not in collections.Sequence.__abstractmethods__:
assert(False) # or however you'd like the test to fail
return object.__getattribute__(self, name)
自己直接实现ABC,根据代码需要使用简单或复杂的方法:
import collections
class TestSequence(collections.Sequence):
def __init__(self):
pass
def __len__(self):
return 3
def __getitem__(self, index):
return index
如果你犯了一个错误,忽略了抽象方法的实现,你的代码将产生一个错误:
TypeError: Can't instantiate abstract class TestSequence with abstract methods __getitem__
如果您的测试代码调用了ABC没有定义的方法,您将看到通常的无属性错误:
AttributeError: 'TestSequence' object has no attribute 'pop'