Издевательский кверисет в 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, мои бывшие инженеры решили выбрать этот способ.

Вернуться на верх