Django ORM - valores simulados (). Chain filter ()

Eu estou tentando zombar de uma chamada encadeada nos Djangosmodel.Manager() classe. Por enquanto eu quero zombar dovalues() efilter() método.

Para testar, criei um pequeno projeto de teste:

Crie um ambiente virtualCorrepip install django mock mock-django nose django-noseCrie um projetodjango-admin.py startproject mocktestCrie um aplicativomanage.py startapp mockmeAdicionardjango_nose emocktest.mockme paraINSTALLED_APPS (settings.py)AdicionarTEST_RUNNER = 'django_nose.NoseTestSuiteRunner' para settings.py

Para verificar se tudo está configurado corretamente eu corrimanage.py test. Um teste é executado, o teste padrão que o Django cria quando você cria um aplicativo.

A próxima coisa que fiz foi criar um modelo muito simples.

mockme / models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=50)

A próxima coisa que fiz foi criar uma função simples que usaMyModel. Essa é a função que quero testar mais tarde.

mockme / functions.py

from models import MyModel

def chained_query():
    return MyModel.objects.values('name').filter(name='Frank')

Nada de especial está acontecendo aqui. A função está filtrando os objetos MyModel para encontrar todas as instâncias ondename='Frank'. A chamada para values ​​() retornará umValuesQuerySet que conterá apenas o campo de nome de todas as instâncias de MyModel encontradas.

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)

O primeiro assertEquals será avaliado como bem sucedido. Nenhuma instância é retornada, pois o gerenciador de modelos ainda não foi burlado. Quando o segundo assertEquals é chamado, esperoresult para conter a instância MyModel que adicionei como valor de retorno ao QuerySetMock:

qsm = QuerySetMock(MyModel, MyModel(name='Frank'))

Eu zombei dofilter() método e não ovalues() método desde que eu encontrei será a última chamada avaliada, embora eu não tenho certeza.

O teste falhará porque a segunda variável de resultado não conterá nenhuma ocorrência de MyModel.

Para ter certeza de quefilter() O método é realmente ridicularizado Eu adicionei uma instrução "debug print":

from django.db import models
print models.Manager.filter

que retornou:

<SharedMock name='mock.iterator' id='4514208912'>

O que estou fazendo de errado?

questionAnswers(1)

yourAnswerToTheQuestion