2012-10-14 11 views
10

Djangos model.Manager() sınıfında zincirleme çağrısı alamaya çalışıyorum. Şimdilik values() ve filter() yöntemini kullanmak istiyorum. Django ORM - alay değerleri(). Filter() zinciri

Ben küçük bir test projesini oluşturdu test etmek için:

  1. bir sanal ortam
  2. Run pip install django mock mock-django nose django-nose
  3. bir uygulama oluşturun manage.py startapp mockme
  4. ekle bir proje django-admin.py startproject mocktest
  5. oluştur django_nose ve mocktest.mockmeINSTALLED_APPS (ayarlar.py)
  6. TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

her şeyin VERFIY için settings.py ekle kurulumunun doğru ben manage.py test koştum. Bir test çalıştırılır, bir uygulama oluşturduğunuzda standart test Django oluşturulur.

Yaptığım sonraki şey çok basit bir model oluşturmaktı.

mockme/models.py yaptım

from django.db import models 

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

sonraki şey MyModel kullanan basit bir fonksiyon yaratmaktı. Daha sonra test etmek istediğim fonksiyon bu.

mockme/functions.py özel

from models import MyModel 

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

Hiçbir şey burada oluyor. İşlev, name='Frank''un bulunduğu tüm örnekleri bulmak için MyModel nesnelerini filtreliyor. Değerler() çağrısı, yalnızca bulunan tüm MyModel örneklerinin ad alanını içerecek olan bir ValuesQuerySet döndürecektir.

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) 

ilk assertEquals olarak başarılı değerlendirecektir. Model Yöneticisi henüz alamadığı için hiçbir örnek iade edilmiyor. Ben son değerlendirilecek edeceğiz bulundu beri

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

Ben filter() yöntemi olup values() yöntem alay: İkinci assertEquals Ben QuerySetMock dönüş değeri olarak eklenen MyModel örneğini içermek üzere result bekliyoruz çağrıldığında arama, emin değilim.

İkinci sonuç değişkeni herhangi bir MyModel örneği içermediği için test başarısız olur.

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

döndü: Neyi yanlış yapıyorum

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

filter() yöntem gerçekten bir "ayıklama print" ifadesi eklendi alay emin olmak için mi?

cevap

4

bu deneyin:

import mock 
from mocktest.mockme.models import MyModel 

class SimpleTest(TestCase): 
    def test_chained_query(self): 
     my_model_value_mock = mock.patch(MyModel.objects, 'value') 
     my_model_value_mock.return_value.filter.return_value.count.return_value = 10000 
     self.assertTrue(my_model_value_mock.return_value.filter.return_value.count.called) 
+0

o ' 'değerler')' olması gerekmez mi? – Splatmistro