Издевательский кверисет в Django unittest
У меня есть пример кода и тест:
queryset_response = something.object.filter(foo="bar", foo1="bar1")
for count, queryset_res in enumerate(queryset_response):
store = queryset_response[0].data
print(store)
Я хочу протестировать эту ситуацию с помощью mock и, возможно, вернуть список queryset с помощью mock, если это возможно.
m_queryset = Mock()
m_queryset.filter.return_value = #<queryset> if possible
# also I wanna return data for the 0th value to test store = queryset_response[0].data
m_queryset.filter().data.return_value = "some string"
# i tried sending dict into m_qeueryset.filter.return_value. nothing works.
Вам не следует издеваться над результатом фильтра, так как это будет похоже на юнит-тестирование самого django. Вместо этого вы должны тестировать свои собственные функции , которые будут вызывать Model.object.filter. Вы можете создать объекты, с которыми вы будете работать, в настройке вашего юнит-теста, и утверждать, что при вызове вашей функции ожидаемый результат совпадает с этими объектами. Например:
def my_own_function(foo, foo1):
queryset_response = Something.objects.filter(foo=foo, foo1=foo1)
store = queryset_response[0].data
return store
и в вашем модульном тесте:
def test_my_own_function():
data = "mydata"
sample_obj = Something.objects.create(foo="bar", foo1="bar1", data=data)
result = my_own_function("bar", "bar1")
self.assertEqual(result, data)
я использовал mock и возвращал namedtuple, чтобы он вел себя как queryset и использовал точку (.) для доступа к набору данных. Я мог бы создать класс и использовать его таким же образом.
def test_func():
something = mock.Mock()
key = collections.namedtuple('key', 'data')
response = key('some_string')
something.objects.filter.return_value = [response]
это своего рода издевательство над django, как сказал gloo, мои бывшие инженеры решили выбрать этот способ.