如何利用字典值快速创建指定类的Mock对象
批量基于字典创建带spec的Mock对象
针对你需要批量将字典值映射到Mock对象属性的场景,有几种简洁的实现方式:
方法1:直接更新Mock的__dict__
Mock对象的属性存储在__dict__字典中,直接用你的数据字典更新它即可完成批量赋值,这种方式最简洁:
from unittest.mock import MagicMock class User: def __init__(self, amount, enabled): self.amount = amount self.enabled = enabled values1 = {'amount': 1, 'enabled': False} values2 = {'amount': 2, 'enabled': True} # 创建带spec的Mock并批量赋值 user_mock1 = MagicMock(spec=User) user_mock1.__dict__.update(values1) user_mock2 = MagicMock(spec=User) user_mock2.__dict__.update(values2) # 验证结果 print(user_mock1.amount) # 输出: 1 print(user_mock1.enabled) # 输出: False print(user_mock2.amount) # 输出: 2 print(user_mock2.enabled) # 输出: True
方法2:用setattr循环赋值
如果需要对属性值做额外处理(比如类型转换),可以用setattr遍历字典键值对:
user_mock1 = MagicMock(spec=User) for attr_name, attr_value in values1.items(): setattr(user_mock1, attr_name, attr_value)
方法3:封装成工具函数(批量创建更高效)
如果需要创建多个Mock对象,把逻辑封装成函数能提升复用性:
def build_mock(spec_class, data_dict): mock_instance = MagicMock(spec=spec_class) mock_instance.__dict__.update(data_dict) return mock_instance # 批量创建Mock user_mock1 = build_mock(User, values1) user_mock2 = build_mock(User, values2)
注意事项
因为你使用了spec=User,Mock对象会被限制只能拥有User类已存在的属性,这和你“字典键与类属性完全一致”的场景匹配,不会出现属性不匹配的问题。如果字典中存在User没有的键,赋值时会抛出AttributeError,刚好能帮你校验数据的正确性。
内容的提问来源于stack exchange,提问作者Gonzalo
相关产品推荐
相关产品推荐

