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

Posted

技术标签:

【中文标题】如何使 Python 模拟从基类派生?【英文标题】:How to make a Python mock derive from a base class? 【发布时间】:2020-09-20 04:58:13 【问题描述】:

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

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

class A

    A(std::unique_ptr<B> B_ptr);

它接受unique_ptrclass B 的对象。 class B 是一个可以派生的抽象基类。我已经编写了绑定,这样class B 可以从 Python 派生。使用 unittest.mock 创建的 Python 模拟是否可以从 class B 派生,以便 A 在其构造函数中接受模拟?

【问题讨论】:

【参考方案1】:

Mocks 在定义时可以有一个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

【讨论】:

其实这是不行的,当这个mock被发送到一个C++函数时,由于不是B或者派生自B而被拒绝。 @In78:这并不完全让我感到惊讶。在 C 扩展层,pybind11 可能会以绕过Mock 的伪类以支持其真实类的方式进行类型检查。在这种情况下,我认为你被卡住了,你只需要重新实现一个实际的 B 子类,它具有你需要的模拟行为,抱歉。 python 中没有任何模拟框架允许模拟从模拟类派生吗?就像 google mock 对 C++ 的工作方式一样。

以上是关于如何使 Python 模拟从基类派生?的主要内容,如果未能解决你的问题,请参考以下文章

如何从基类动态创建派生类

如何从基类调用派生类方法?

如何从基类调用派生赋值运算符?

从基类调用派生类的隐藏(非虚拟)方法

如何使用 C++ 中的模板编程从基类创建派生类?

如何从基类 C++ 访问派生数据