假设我有一个记录为collections.Sequence
ABC的函数。如何针对ABC接口测试此函数中的代码?我是否可以编写单元测试(或测试)来确认我的代码只调用此ABC定义的方法,而不是list
定义的方法或collections.Sequence
的其他具体实现?或者是否有其他工具或方法来验证这一点?
答案 0 :(得分:1)
只需通过传递仅实现这些方法的类的实例来测试该函数。如果需要,您可以继承内置类型(例如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)
答案 1 :(得分:0)
直接自己实施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'