python - 如何模拟就地算术运算符
问题描述
我试图__iadd__
用MagicMock
from模拟就地操作员的魔术方法unittest.mock
,但调用断言意外失败:
>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> m += 1
>>> m.__iadd__.assert_called_once() # This expected NOT to fail
Traceback (most recent call last):
...
AssertionError: Expected '__iadd__' to have been called once. Called 0 times.
模拟其他魔术方法效果很好:
>>> m = MagicMock()
>>> m + 1
>>> m.__add__.assert_called_once()
>>> # No error
在对新实例进行m += 1
设置之后,因为所有模拟方法都返回新的模拟。我们像这样在常规类中覆盖:m
MagicMock
__iadd__
class A:
def __iadd__(self, other):
...
return self # <-- We must return self
但是所有模拟的方法包括__iadd__
看起来像:
def __iadd__(self, *args, **kwargs):
...
return MagicMock()
在我看来,这就是它失败的原因。
那么,我如何正确地模拟就地算术魔术方法呢?
解决方案
像这样更改返回值__iadd__
:
>>> m = MagicMock()
>>> m.__iadd__.return_value = m
>>> m += 1
>>> m.__iadd__.assert_called_once()
>>> m.__iadd__.call_count
1
推荐阅读
- amazon-s3 - minikube 上的 MinIO 操作员不工作
- jmeter - 如何使用 jmeter 测试 webm 视频流?
- reactjs - 用 Jest 模拟 react-native Appearance
- python - 我的 sqlite3 请求不返回所有列表
- laravel - HybridRelations laravel mongo 真的很慢
- c# - Discord .Net 作为用户(不是机器人)阅读消息
- amazon-web-services - 如何使用 CDK 在亚马逊 S3 存储桶中创建文件夹以放大上传要求
- python - tkinter:如何使这些框适合左侧并成直线
- c# - 统一固定四元数旋转
- c# - WPF 数据网格格式 - 并非所有样式都受到尊重