मैं Djangos model.Manager()
कक्षा पर एक जंजीर कॉल का मज़ाक लगाने की कोशिश कर रहा हूं। अभी के लिए मैं values()
और filter()
विधि का नकल करना चाहता हूं।Django ORM - नकली मान() फ़िल्टर() श्रृंखला
जांचने के लिए कि मैं एक छोटे से परीक्षण परियोजना बनाया:
- एक आभासी वातावरण
- भागो
pip install django mock mock-django nose django-nose
- एक परियोजना
django-admin.py startproject mocktest
- किसी ऐप बनाएं
manage.py startapp mockme
- जोड़े बनाएँ
django_nose
औरmocktest.mockme
INSTALLED_APPS
(सेटिंग्स.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')
कुछ भी नहीं विशेष यहां हो रहा है। यह फ़ंक्शन 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()
विधि वास्तव में मज़ाक उड़ाया गया है मैं एक "डिबग प्रिंट" बयान जोड़े जाने के लिए?
कि ' 'मान')' नहीं होना चाहिए? – Splatmistro