2

假设我有一个记录为采用collections.SequenceABC的函数。如何针对 ABC 接口测试此函数中的代码?我是否可以编写一个单元测试(或多个测试)来确认我的代码仅调用此 ABC 定义的方法,而不是例如由 ABC 定义的方法list或其他具体实现collections.Sequence?或者是否有其他工具或方法来验证这一点?

4

2 回答 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 回答