假设我有一个记录为采用collections.Sequence
ABC的函数。如何针对 ABC 接口测试此函数中的代码?我是否可以编写一个单元测试(或多个测试)来确认我的代码仅调用此 ABC 定义的方法,而不是例如由 ABC 定义的方法list
或其他具体实现collections.Sequence
?或者是否有其他工具或方法来验证这一点?
问问题
134 次
2 回答
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)
于 2015-05-29T03:11:57.707 回答
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'
于 2015-05-29T03:26:14.987 回答