Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 测试Python代码是否只使用ABC方法_Python 2.7_Abstract Base Class - Fatal编程技术网

Python 2.7 测试Python代码是否只使用ABC方法

Python 2.7 测试Python代码是否只使用ABC方法,python-2.7,abstract-base-class,Python 2.7,Abstract Base Class,假设我有一个函数,它被记录为。如何根据ABC接口测试此函数中的代码?我可以写一个单元测试(或多个测试)来确认我的代码只调用这个ABC定义的方法,而不是,比如说,list或集合的一些其他具体实现所定义的方法。Sequence?或者是否有其他工具或方法来验证这一点?只需通过传递仅实现这些方法的类的实例来测试函数。如果需要,可以对内置类型(如list)进行子类化,并重写其方法,如下所示: class TestSequence(list): def __getattribute__(self,

假设我有一个函数,它被记录为。如何根据ABC接口测试此函数中的代码?我可以写一个单元测试(或多个测试)来确认我的代码只调用这个ABC定义的方法,而不是,比如说,
list
集合的一些其他具体实现所定义的方法。Sequence
?或者是否有其他工具或方法来验证这一点?

只需通过传递仅实现这些方法的类的实例来测试函数。如果需要,可以对内置类型(如
list
)进行子类化,并重写其方法,如下所示:

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'

“一个只实现这些方法的类的实例”-这是我要问的核心,我想:有没有更简单的方法来获得这样的东西?您的方法有效,但复制了ABC中已有的信息。因此,存在失去同步、犯下另一个错误等风险(同样,如果有人这样做,他们最好使用模拟对象或类似对象,具体取决于测试)。如果名称不按顺序排列,使用
。\uuuuuu abstractmethods\uuuu
会解决您的问题吗?