Django ORM - цепочка фиктивных значений (). Filter ()
Я пытаюсь издеваться над Джангоmodel.Manager()
учебный класс. Сейчас я хочу издеваться надvalues()
а такжеfilter()
метод.
Чтобы проверить это, я создал небольшой тестовый проект:
Создать виртуальную средуБежатьpip install django mock mock-django nose django-nose
Создать проектdjango-admin.py startproject mocktest
Создать приложениеmanage.py startapp mockme
добавлятьdjango_nose
а такжеmocktest.mockme
вINSTALLED_APPS
(Settings.py)добавлятьTEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
в settings.pyЧтобы убедиться, что все настроено правильно, я запустилmanage.py test
, Один тест запускается, стандартный тест, который Django создает при создании приложения.
Следующим, что я сделал, было создание очень простой модели.
mockme / models.py
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
Следующее, что я сделал, было создать простую функцию, которая используетMyModel
, Тот'Это функция, которую я хочу проверить позже.
mockme / functions.py
from models import MyModel
def chained_query():
return MyModel.objects.values('name').filter(name='Frank')
Здесь ничего особенного не происходит. Функция фильтрует объекты MyModel, чтобы найти все экземпляры, гдеname='Frank'
, Вызов значения () вернетValuesQuerySet
который будет содержать только поле имени всех найденных экземпляров MyModel.
mockme / tests.py
import mock
from django.test import TestCase
from mocktest.mockme.models import MyModel
from mocktest.mockme.functions import chained_query
from mock_django.query import QuerySetMock
class SimpleTest(TestCase):
def test_chained_query(self):
# without mocked queryset the result should be 0
result = chained_query()
self.assertEquals(result.count(), 0)
# now try to mock values().filter() and reeturn
# one 'Frank'.
qsm = QuerySetMock(MyModel, MyModel(name='Frank'))
with mock.patch('django.db.models.Manager.filter', qsm):
result = chained_query()
self.assertEquals(result.count(), 1)
Первые assertEquals оценят как успешные. Экземпляры не возвращаются, поскольку диспетчер моделей еще не проверен. Когда вызывается второй assertEquals, я ожидаюresult
чтобы содержать экземпляр MyModel, который я добавил в качестве возвращаемого значения для QuerySetMock:
qsm = QuerySetMock(MyModel, MyModel(name='Frank'))
Я издевалсяfilter()
метод, а неvalues()
метод, так как я нашел этоЯ буду последним оцененным звонком, хотя я не уверен.
Тест не пройден, потому что вторая переменная результата выигралане содержит никаких экземпляров MyModel.
Чтобы быть уверенным, чтоfilter()
метод действительно издевался, я добавил "отладочная печать » заявление:
from django.db import models
print models.Manager.filter
который вернулся:
Что я делаю неправильно?