Для пустого набора запросов я бы просто использовал none
, так как keithhackbarth уже указал .
Однако, чтобы смоделировать Queryset, который будет возвращать список значений, я предпочитаю использовать Mock с spec
менеджера модели. В качестве примера (стиль Python 2.7 - я использовал внешнюю библиотеку Mock ), вот простой тест, в котором Queryset фильтруется и затем подсчитывается:
from django.test import TestCase
from mock import Mock
from .models import Example
def queryset_func(queryset, filter_value):
"""
An example function to be tested
"""
return queryset.filter(stuff=filter_value).count()
class TestQuerysetFunc(TestCase):
def test_happy(self):
"""
`queryset_func` filters provided queryset and counts result
"""
m_queryset = Mock(spec=Example.objects)
m_queryset.filter.return_value = m_queryset
m_queryset.count.return_value = 97
result = func_to_test(m_queryset, '__TEST_VALUE__')
self.assertEqual(result, 97)
m_queryset.filter.assert_called_once_with(stuff='__TEST_VALUE__')
m_queryset.count.assert_called_once_with()
Однако, чтобы выполнить вопрос, вместо установки return_value
для count
, его можно легко откорректировать, чтобы он был list
экземпляров модели, возвращаемых из all
.
Обратите внимание, что цепочка обрабатывается путем установки filter
для возврата проверенного набора запросов:
m_queryset.filter.return_value = m_queryset
Это необходимо применять для любых методов набора запросов, используемых в тестируемой функции, например, exclude
и т. Д.