如何使Python模拟从基类派生?

问题描述

我正在使用pybind11为某些C ++代码实现python绑定。现在,我正在尝试为绑定编写单元测试。

C ++中有一个class A,其构造函数如下:

class A
{
    A(std::unique_ptr<B> B_ptr);
}

它接受unique_ptr对象的class Bclass B是可以派生的抽象基类。我编写了绑定,使得class B可以从Python派生。使用unittest.mock创建的Python模拟程序是否可以从class B派生,以便A在其构造函数中接受该模拟程序?

解决方法

在定义时,模仿可以具有spec,模仿它们可以从中借用报告的类(以及许多其他基本行为)。因此,最简单的方法是:

mymock = Mock(spec=B())  # Mock borrows behaviors of this instance of B,including class

如果您不想使用spec(具有许多其他副作用),则可以对报告的类进行有针对性的修改。 Mocks have an assignable __class__ attribute,因此这将使否则为空白的Mock报告为B的子类:

mymock = Mock()
mymock.__class__ = B