python - 部分模拟 Python 类 __init__?
问题描述
我有一个具有复杂初始化的 Python 类。我想模拟类初始化以避免编写过多的脚手架代码。我想测试它的非模拟方法。
一个简单的例子:
class Person:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def do_work(self):
return self.x + self.y
有一个答案显示了如何完成它并且它有效 - https://stackoverflow.com/a/21771920/3346915。
这是一个通过测试:
from unittest.mock import patch
with patch.object(Person, '__init__', lambda self: None):
person = Person()
person.x = 3
person.y = 4
assert person.do_work() == 7
但是,我想知道是否可以通过x
并y
作为Person
初始化的一部分来避免在构造后分配字段以减少代码量?
我想知道这是否可能?
from unittest.mock import patch
with patch.object(Person, '__init__', lambda self, x, y: None):
person = Person(x=3, y=4)
assert person.do_work() == 7
这当然不起作用,因为x
andy
值没有分配给person
实例。
解决方案
lambda
s 不支持赋值,但你不必使用lambda
作为第三个参数 - 普通(命名)函数也可以,所以你可以这样做:
class Person:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def do_work(self):
return self.x + self.y
from unittest.mock import patch
def newinit(self, x, y):
self.x = x
self.y = y
with patch.object(Person, '__init__', newinit):
person = Person(x=3, y=4)
assert person.do_work() == 7
(在 Python 3.7.3 中测试)
推荐阅读
- html - 表格单元格中同一行高的输入和符号彼此相邻?
- mysql - 而 mysql 可以在 /var/lib 中创建具有 drwxr-xr-x 权限的目录?
- .net-core - 是否可以在 C++/CLI 项目中使用 dotnet core
- ubuntu - 将 VPS 上的 nginx 从 http 转换为 https
- c - RegQueryValueExW 在 C 中返回访问冲突读取位置异常
- javascript - 在 node.js 的数组中创建数组?
- java - 如何从 Python 服务器向 Java 客户端发送消息
- python - 如何匹配引号之间的字符串中的确切字符串
- kendo-grid - 如何在剑道网格中以编程方式添加组和组的总和
- javascript - 如何使用 express 和 mongoose 连接到本地网络中的 MongoDB