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

который вернулся:


Что я делаю неправильно?

Ответы на вопрос(1)

Ваш ответ на вопрос