抽象基类——测试Python代码只使用ABC方法



假设我有一个函数,它被记录为取collections.Sequence ABC。如何针对ABC接口测试此函数中的代码?我可以编写一个单元测试(或多个测试)来确认我的代码只调用由ABC定义的方法,而不是由listcollections.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'

相关内容

  • 没有找到相关文章

最新更新