Django Queryset 模拟对象和计数

Django Queryset mock objects and count

我正在寻找一种在同一测试中同时模拟 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])

这不起作用,因为模拟列表没有计数方法。我不想 return 模拟而不是模拟列表,因为我仍然希望能够循环遍历模拟。

你能帮忙吗?

谢谢!

我找到了以下使用 __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