测试Python代码只使用ABC方法

时间:2015-05-29 02:52:44

标签: python-2.7 abstract-base-class

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

2 个答案:

答案 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'