如何使 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_ptr
到class 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
(它有许多其他副作用),您可以对报告的类进行有针对性的修改。 Mock
s 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 模拟从基类派生?的主要内容,如果未能解决你的问题,请参考以下文章