【问题标题】:Django Queryset mock objects and countDjango Queryset 模拟对象和计数
【发布时间】:2021-06-25 15:11:25
【问题描述】:

我正在寻找一种在同一测试中模拟 Django 查询集结果和计数结果的方法。 请在下面找到代码 sn-p 以概述我尝试做的事情。这不是真正的代码,只是一个没有什么有趣的简化版本。

# 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 列表,因为我仍然希望能够循环遍历这些模拟。

你能帮忙吗?

谢谢!

【问题讨论】:

    标签: python django mocking django-queryset


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2019-03-25
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多