我正在寻找一种在同一测试中模拟Django查询集结果和计数结果的方法。请在下面找到一个代码片段,概述我尝试做的事情。这不是真正的代码,只是一个简化的版本,没有什么有趣的。
# METHOD
def method_to_mock(car_ids):
cars = Car.objects.filter(id__in=car_ids).order_by("creation_date")
if cars.count() != len(car_ids):
missing_cars = set(car_ids) - set(cars.values_list("id", flat=True))
logger.error(f"Failed to retrieve cars {missing_cars}.")
for car in cars:
print(car.brand)
# TESTING
mock_filter = mocker.patch("Car.objects")
mock_filter.filter.return_value.order_by.return_value = [mocker.Mock(), mocker.Mock()]
mock_filter.filter.return_value.order_by.return_value.count.return_value = 2
method_to_mock([0, 1, 2])
这不起作用,因为模拟列表没有计数方法。我不想返回Mock而不是Mock列表,因为我仍然希望能够循环浏览Mock。
你能帮忙吗?
谢谢!
我已经找到了以下使用__iter__
的方法
mock_filter = mocker.patch("Car.objects.filter")
mock_filter.return_value.order_by.return_value = mock_filter
mock_filter.__iter__.return_value = [mocker.Mock(), mocker.Mock()]
mock_filter.count.return_value = 2