python - 更改对象补丁以外的其他属性的返回值
问题描述
我有以下单元测试。
class PhoneBook:
def __init__(self):
self.numbers: Dict[str, str] = {}
def add(self, name: str, number: str) -> None:
self.numbers[name] = number
def lookup(self, name: str) -> str:
return self.numbers[name]
class Mobile:
def __init__(self, phonebook: PhoneBook):
self.phonebook = phonebook
def call(self, name: str) -> None:
number = self.phonebook.lookup(name)
logging.info(f"Calling {name} on number: {number}")
@mock.patch.object(PhoneBook, "add")
def test_mobile_call(mock_phonebook: PhoneBook):
# Arrange
mock_phonebook.lookup.return_value = "123"
mobile = Mobile(mock_phonebook)
# Act
mobile.call("Nick")
# Assert
mock_phonebook.lookup.assert_called_with("Nick")
使用补丁注释我希望修补add
电话簿的功能/方法。但正如您所看到的,我实际上能够更改lookup
方法的返回值并断言它是使用特定值调用的。
- 我不确定这是否真的是预期的结果?
PhoneBook
如果该属性甚至没有被修补/使用,为什么我要在注释中给它“添加”参数?就像,为什么没有进一步检查呢?如果我输入一个空字符串,或者一个不属于PhoneBook
它的属性,则会引发错误。- 我是否将补丁注释用于错误的目的?
解决方案
这种行为的原因是您实际上并没有调用修补函数 ( Phonebook.add
)。你从那个补丁中得到的是一个MagickMock
修补函数的对象,但除此之外只是一个通用的模拟。
正在做的事情相当于:
def test_mobile_call():
# Arrange
mock_phonebook = MagicMock()
mock_phonebook.lookup.return_value = "123"
mobile = Mobile(mock_phonebook)
# Act
mobile.call("Nick")
# Assert
mock_phonebook.lookup.assert_called_with("Nick")
简而言之,在这种情况下您不需要修补任何东西,因为您要模拟的对象作为参数传递给测试函数。
推荐阅读
- java - 使用 RecyclerView GridLayoutManager 禁用拖放
- html - 如何动画一条线从两个方向延伸,从中间的一点开始?
- arrays - 从数组对象获取属性的最有效方法是什么?
- javascript - 如何从 NodeJS 中的原始 PG 值获取时间戳片段
- javascript - Vuejs如何用i18翻译工作日
- java - 其他类的参考
- javascript - 动态图层组传单
- php - 在 Grav admin 中获取页面的后代
- aws-cdk - 将 CDK 导出到 cloudformation 模板 -python
- node.js - server.js 中定义的变量,但模板给出错误“未定义”