2012-10-14 13 views
10

मैं Djangos model.Manager() कक्षा पर एक जंजीर कॉल का मज़ाक लगाने की कोशिश कर रहा हूं। अभी के लिए मैं values() और filter() विधि का नकल करना चाहता हूं।Django ORM - नकली मान() फ़िल्टर() श्रृंखला

जांचने के लिए कि मैं एक छोटे से परीक्षण परियोजना बनाया:

  1. एक आभासी वातावरण
  2. भागो pip install django mock mock-django nose django-nose
  3. एक परियोजना django-admin.py startproject mocktest
  4. किसी ऐप बनाएं manage.py startapp mockme
  5. जोड़े बनाएँ django_nose और mocktest.mockmeINSTALLED_APPS (सेटिंग्स.py)
  6. 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') 

कुछ भी नहीं विशेष यहां हो रहा है। यह फ़ंक्शन name='Frank' पर सभी उदाहरण ढूंढने के लिए MyModel ऑब्जेक्ट्स को फ़िल्टर कर रहा है। मूल्यों() को कॉल 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 उदाहरण नहीं होंगे।

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

जो लौटे:

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

क्या मैं गलत कर रहा हूँ

सुनिश्चित करें कि filter() विधि वास्तव में मज़ाक उड़ाया गया है मैं एक "डिबग प्रिंट" बयान जोड़े जाने के लिए?

उत्तर

4

इस प्रयास करें:

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

कि ' 'मान')' नहीं होना चाहिए? – Splatmistro