当前位置: 首页 > 面试题库 >

Python-测试抽象基类

欧阳玺
2023-03-14
问题内容

我正在寻找在抽象基类中定义的测试方法的方法/最佳实践。我可以直接想到的一件事是对基类的所有具体子类执行测试,但这有时显得有些多余。

考虑以下示例:

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不进行任何子类化的情况下进行测试?


问题答案:

正如lunaryon所说,这是不可能的。包含抽象方法的ABC的真正目的是,它们不能像声明的那样实例化。

但是,可以创建一个对ABC进行内省的实用函数,并动态创建一个虚拟的非抽象类。可以在测试方法/函数内部直接调用此函数,而不必为了测试几种方法而在测试文件中写入样板代码。

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)


 类似资料:
  • 抽象路由类 aiohttp使用抽象类来管理web接口。 aiohttp.web中大部分类都不打算是可以继承的,只有几个是可以继承的。 aiohttp.web建立在这几个概念之上: 应用(application),路由(router),请求(request)和响应(response)。 路由(router)是一个可插拔的部分: 用户可以从头开始创建一个新的路由库,不过其他的部分必须与这个新路由无缝契

  • 问题内容: 我想测试一个抽象类。当然,我可以手动编写一个从类继承的模拟。 我可以使用模拟框架(我正在使用Mockito)来执行此操作,而不是手工制作模拟吗?怎么样? 问题答案: 以下建议让你在不创建“真实”子类的情况下测试抽象类-Mock 是子类。 使用,然后模拟所有被调用的抽象方法。 例: 注意:此方法的好处是,你不具备实现的抽象方法,只要他们永远不会被调用。 在我看来,这比使用间谍更整洁,因为

  • How ABCs Work # abc_base.py import abc class PluginBase(metaclass=abc.ABCMeta): @abc.abstractmethod def load(self, input): """Retrieve data from the input source and return

  • 我从Wicket开始,正在做TDD(当然是使用WicketTester) 我在尝试使用标记继承创建公共布局时遇到了一个问题 我查看了包括这一个在内的在线示例。然而,这些示例没有提到如何测试父类。 问题是父类是抽象的。这意味着,无法实例化页面,它会抛出一个异常(这是理所当然的) 我曾想过使用mock或fake类将该类作为常规POJO进行测试,但之后我将无法测试抽象父类中的wicket组件 我考虑的另

  • 本文向大家介绍python抽象基类用法实例分析,包括了python抽象基类用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python抽象基类用法。分享给大家供大家参考。具体如下: 定义抽象类,需要使用abc模块,该模块定义了一个元类(ABCMeata),和装饰器 @abstractmethod, @abstractproperty 如果要实例化继承了Foo 的子类,子类必须实

  • 当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。