在Python中,可以通过为每个MagicMock
实例单独配置属性来实现差异化设置。以下是具体方法和示例:
MagicMock
是unittest.mock
模块中的类,用于模拟对象行为。其核心特性包括:
from unittest.mock import MagicMock
# 创建两个独立的MagicMock实例
mock1 = MagicMock()
mock2 = MagicMock()
# 为每个实例设置不同属性
mock1.some_attr = "value_for_mock1"
mock2.some_attr = "value_for_mock2"
print(mock1.some_attr) # 输出: value_for_mock1
print(mock2.some_attr) # 输出: value_for_mock2
configure_mock
方法mock1.configure_mock(some_attr="value_A", method_return=100)
mock2.configure_mock(some_attr="value_B", method_return=200)
print(mock1.some_attr) # 输出: value_A
print(mock1.method_return()) # 输出: 100
print(mock2.some_attr) # 输出: value_B
print(mock2.method_return()) # 输出: 200
mock1.some_method.return_value = "result1"
mock2.some_method.side_effect = lambda x: f"result2_{x}"
print(mock1.some_method()) # 输出: result1
print(mock2.some_method("data")) # 输出: result2_data
MagicMock
实例独立创建,避免共享引用。mock1.submodule.func.return_value = 42
)。side_effect
:可绑定函数、异常或可迭代对象return_value
:固定返回值configure_mock
)。reset_mock()
后重新配置。autospec
或属性被意外修改。from unittest.mock import MagicMock
# 场景:模拟两个数据库连接的不同查询结果
db_mock1 = MagicMock()
db_mock1.query.return_value = ["user1", "user2"]
db_mock2 = MagicMock()
db_mock2.query.side_effect = Exception("Connection failed")
# 测试用例
try:
print(db_mock1.query()) # 输出: ['user1', 'user2']
print(db_mock2.query()) # 抛出异常
except Exception as e:
print(f"Error: {e}") # 输出: Error: Connection failed
通过以上方法,可灵活控制每个MagicMock
实例的行为差异。