Python-测试抽象基类 [英] Python - Testing an abstract base class
问题描述
我正在寻找有关测试抽象基类中定义的方法的方法/最佳实践.我可以直接想到的一件事是对基类的所有具体子类执行测试,但这在某些时候似乎很繁琐.
I am looking for ways / best practices on testing methods defined in an abstract base class. One thing I can think of directly is performing the test on all concrete subclasses of the base class, but that seems excessive at some times.
请考虑以下示例:
import abc
class Abstract(object):
__metaclass__ = abc.ABCMeta
@abc.abstractproperty
def id(self):
return
@abc.abstractmethod
def foo(self):
print "foo"
def bar(self):
print "bar"
是否可以在不进行任何子类化的情况下测试bar
?
Is it possible to test bar
without doing any subclassing?
推荐答案
lunaryon正确地指出,这是不可能的.包含抽象方法的ABC的真正目的是,它们不能像声明的那样实例化.
As properly put by lunaryon, it is not possible. The very purpose of ABCs containing abstract methods is that they are not instantiatable as declared.
但是,可以创建一个对ABC进行内省的实用函数,并即时创建一个虚拟的非抽象类.该函数可以在您的测试方法/函数中直接调用,省去了仅在测试文件中写一些样板代码就可以测试几种方法的麻烦.
However, it is possible to create a utility function that introspects an ABC, and creates a dummy, non abstract class on the fly. This function could be called directly inside your test method/function and spare you of having to wite boiler plate code on the test file just for testing a few methods.
def concreter(abclass):
"""
>>> import abc
>>> class Abstract(metaclass=abc.ABCMeta):
... @abc.abstractmethod
... def bar(self):
... return None
>>> c = concreter(Abstract)
>>> c.__name__
'dummy_concrete_Abstract'
>>> c().bar() # doctest: +ELLIPSIS
(<abc_utils.Abstract object at 0x...>, (), {})
"""
if not "__abstractmethods__" in abclass.__dict__:
return abclass
new_dict = abclass.__dict__.copy()
for abstractmethod in abclass.__abstractmethods__:
#replace each abc method or property with an identity function:
new_dict[abstractmethod] = lambda x, *args, **kw: (x, args, kw)
#creates a new class, with the overriden ABCs:
return type("dummy_concrete_%s" % abclass.__name__, (abclass,), new_dict)
这篇关于Python-测试抽象基类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!