如何解决如何在没有原始 PropertyMock 对象的情况下为断言获取 PropertyMock?
我有一个为单元测试目的创建的 unittest.mock.PropertyMock
(docs) 对象,位于对象内的一个属性上。
我不再引用 PropertyMock
,因为 PropertyMock
在测试设置期间被猴子修补。
如果我拥有具有给定 PropertyMock
的对象,我如何才能访问 property
以进行断言?
from typing import Any
from unittest.mock import PropertyMock
class Foo:
@property
def property_1(self) -> int:
return 1
def make_obj() -> Any:
"""Make some object,not returning a reference to the PropertyMock made inside."""
my_obj = Foo()
type(my_obj).property_1 = PropertyMock(return_value=100)
# NOTE: function doesn't return the PropertyMock,only the object
return my_obj
def test_make_obj() -> None:
made_obj = make_obj()
# We can see the PropertyMock is in place and works
assert made_obj.property_1 == 100
# How can I assert the property was set with 9001? NOTE: I don't have access
# to the PropertyMock made above
made_obj.property_1 = 9001
type(made_obj).property_1.assert_called_once_with(9001) # This fails
# AttributeError: 'int' object has no attribute 'assert_called_once_with'
换句话说:
- 在
PropertyMock
中进行猴子修补后 - 调用
type(my_obj).property_1
返回100
- 我希望它返回使用的
PropertyMock
(用于断言)
解决方法
这有点棘手,因为通过属性访问属性模拟将始终返回模拟的结果而不是模拟本身。
这是由于它的运行方式:Type mismatch.
Required:
Int
Found:
LazyPagingItems<Category>
覆盖 PropertyMock
以返回设置值,一旦您通过点表示法使用属性访问(或者如果您使用 {{ 1}})。您不能自己覆盖 __get__
,因为这会破坏 getattr
的功能。
您可以通过直接访问类的 __get__
来解决此问题:
PropertyMock
您可能可以使用一些辅助函数来使这更好一点,但您仍然需要通过属性名称进行访问,至少我看不出其他方法。
我能想到的唯一另一种可能性是通过模拟本身,尽管这当然有些多余和丑陋:
__dict__
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。