【发布时间】:2019-08-29 18:19:17
【问题描述】:
正如unittest.mock documentation 指出的那样:
由于模拟属性的存储方式,您不能直接将 PropertyMock 附加到模拟对象。相反,您可以将其附加到模拟类型对象
但是,我遇到了一些情况,我想在单个测试中模拟多个类实例上的多个属性值。
例如,假设我有一个带有availability 属性的TimeSlot 类:
class TimeSlot:
@property
def availability(self):
# Run a complex DB query to determine availability
...我有一个帮助类,它按availability 对TimeSlot 实例列表进行排序:
from unittest.mock import Mock
from app.helpers import sort_slots
from app.models import TimeSlot
def test_sort_slots_reorders_by_descending_availability():
slot_a = TimeSlot()
slot_a.availability = Mock(return_value=0.1) # BOOM!
slot_b = TimeSlot()
slot_b.availability = Mock(return_value=0.2)
slots = [slot_a, slot_b]
assert sort_slots(slots) == [slot_b, slot_a]
当我尝试将 Mock(或 PropertyMock)分配给 availability 属性时,运行此测试会引发错误:
AttributeError: can't set attribute
有什么方法可以模拟 Python 类的每个实例的属性返回值?
如果没有,我应该以不同的方式来编写这样的单元测试吗?
谢谢!
【问题讨论】:
标签: python unit-testing python-unittest python-unittest.mock