django

2010-01-10 9 views
49

में उपयोगकर्ताओं और अनुरोधों का नकल कैसे करें मेरे पास django कोड है जो अनुरोध ऑब्जेक्ट्स या उपयोगकर्ता ऑब्जेक्ट्स के साथ इंटरैक्ट करता है। जैसे उदाहरण कुछ के लिए:django

foo_model_instance = models.get_or_create_foo_from_user(request.user) 

यदि आप Django अजगर खोल के साथ या एक unittest में परीक्षण करने के लिए जा रहे थे, क्या तुम वहाँ में पारित होगा? यहां बस एक उपयोगकर्ता ऑब्जेक्ट करेगा, लेकिन नकली अनुरोध ऑब्जेक्ट की आवश्यकता भी अक्सर आती है।

खोल के लिए या unittests के लिए:

  • कैसे आप नकली उपयोगकर्ताओं करते हैं?
  • आप अनुरोधों का नकल कैसे करते हैं?
+2

"आप उस शब्द का उपयोग करते रहें, लेकिन मुझे नहीं लगता कि इसका मतलब है कि इसका मतलब क्या है ... "मुझे लगता है कि आपका मतलब है" नकली "। –

+7

@ माइक: यह मजाकिया लगता है, लेकिन मुझे लगता है कि उसे यह सही मिला है। @pax: मुझे पंच लाइन पर मारो :( – mpen

+5

मैं ... मुझे यह स्वीकार करना होगा कि ... मेरे कमरे की चुप्पी में ... देर रात ... मैं ... हाँ, हाँ! मैं उपयोगकर्ताओं का मज़ाक उड़ाता हूं उन सभी! @perrierism: हम आप का मजाक नहीं बना रहे हैं, हम सिर्फ शब्दों की अपनी अद्भुत पसंद का आनंद ले रहे हैं। –

उत्तर

48

अनुरोध के लिए, मैं Django के साथ RequestFactory का उपयोग करता हूं।

from django.test.client import RequestFactory 
rf = RequestFactory() 
get_request = rf.get('/hello/') 
post_request = rf.post('/submit/', {'foo': 'bar'}) 

उपयोगकर्ताओं के लिए, मैं django.contrib.auth.models का उपयोग करता हूं।@ozan के रूप में उपयोगकर्ता ने सुझाव दिया है कि शायद factory boy गति के साथ (फैक्ट्री लड़के के साथ आप डीबी को सहेजने के लिए नहीं चुन सकते हैं)

+0

यह निश्चित रूप से सही जवाब है कि RequestFactory उपलब्ध है। ओजान के जवाब के श्रेय के साथ (वास्तविक वस्तुओं को तुरंत चालू करना वांछनीय है)। मैंने फैक्ट्री बॉय का उपयोग नहीं किया है, लेकिन अगर यह रेल की फैक्टरी गर्ल की गुणवत्ता के करीब है तो ऐसा लगता है कि यह एक उत्कृष्ट विकल्प होगा। – Purrell

+0

सबसे अच्छा समाधान जो मेरे लिए django माइग्रेशन स्क्रिप्ट में काम करता था। हालांकि वर्तमान संस्करण को 'request.user' सेट करने की आवश्यकता है। सामान्य अनुरोध की तरह इस अनुरोध का उपयोग करने के लिए तैयार अनुरोध में 'request.csrf_processing_done = True' होना अच्छा है (सीएसआरएफ चेक पास करने के लिए) – garmoncheg

6

पढ़ें के बारे में नकली यहां वस्तुओं
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

और एक उपयोगकर्ता
http://python-mock.sourceforge.net/

बाकी

आप लिख सकते हैं एक सरल उपयोगकर्ता वर्ग अपने आप को, के रूप में इस का उपयोग नकली को यह अजगर lib का उपयोग एक प्रारंभिक बिंदु

class MockUser(object): 
    def __call__(self, *args, **kwargs): 
     return self 

    def __getattr__(Self, name): 
     return self 

specfic मामलों आदि आदि

38

आप उपयोगकर्ताओं को कैसे नकल करते हैं?

django.contrib.auth.models.User ऑब्जेक्ट प्रारंभ करें। User.objects.create_user यह आसान बनाता है।

कैसे आप नकली अनुरोध करते हैं?

django.http.HttpRequest ऑब्जेक्ट प्रारंभ करें।

बेशक, आप जो करना चाहते हैं उसके आधार पर शॉर्टकट हैं। यदि आपको किसी उपयोगकर्ता को इंगित करने वाले user विशेषता वाले ऑब्जेक्ट की आवश्यकता है, तो बस कुछ (कुछ भी) बनाएं और उसे वह विशेषता दें।

+5

+1: नकली? क्यों नकली? वास्तविक चीज़ का उपयोग करें। –

+1

@ एसएलट यह उपयोग करने के लिए अच्छा है कभी-कभी असली चीज लेकिन आपकी परियोजना बढ़ने के साथ यह बहुत धीमी हो जाती है। कुछ मिनटों के बजाय आप कुछ सेकंड में चलने वाले नकली परीक्षण करना अच्छा लगता है। –

+0

@ टीएम: शायद यह सामान्य रूप से सच है। लेकिन Django क्लाइंट वास्तव में तेज़। क्या आपके पास कुछ बचत और समय बेंचमार्क दिखाने के लिए कुछ बेंचमार्क हैं? –

3

आप के रूप में आप सिर्फ अपने परीक्षण के भीतर एक बना सकते हैं, नकली उपयोगकर्ता की जरूरत नहीं है - के बाद परीक्षण समाप्त हो गया है डेटाबेस नष्ट हो जाता है।

नकली अनुरोध करने के लिए, सिमोन विललिसन से this snippet का उपयोग करें।

+0

जबकि मैं मानता हूं कि आप आमतौर पर परीक्षण के लिए उपयोगकर्ताओं को बनाने के साथ दूर हो सकते हैं - ऐसे समय होते हैं जिन्हें आप नहीं करना चाहते हैं - या ऐसा करना परीक्षण के अनुमोदन के बाहर है। अगर मैं परीक्षण कर रहा हूं कि एक सहायक विधि गलत हो जाती है तो अनुमति अस्वीकार कर दी जाती है - डेटाबेस में जोड़े जाने के लिए यह गलत है। वह सहायक विधि मौजूद है क्योंकि मैं डेटाबेस प्रतिनिधित्व के बारे में जानना नहीं चाहता हूं। – yarbelk

6

आप अपनी खुद की mocks रोल कर सकते हैं या तो, के रूप में अनुराग उनियाल ने सुझाव दिया है, या आप एक मजाक ढांचे का उपयोग कर सकते हैं।

उन के जवाब में यह कहते हुए आप Django में वैसे भी ... मैं इस इकाई परीक्षण के बिंदु धरा सुझाव हैं तो आप सिर्फ एक साधारण उपयोगकर्ता बना सकते हैं। एक यूनिट टेस्ट डेटाबेस को स्पर्श नहीं करना चाहिए, लेकिन उपयोगकर्ता बनाकर, आपने डेटाबेस बदल दिया है, इसलिए हम एक का नकल क्यों करना चाहते हैं।

+0

जैसा कि डैनियल ने उल्लेख किया है, परीक्षण धावक बनाता है तो आपके लिए एक परीक्षण डेटाबेस नष्ट कर देता है, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। – ozan

+3

यदि आप डेटाबेस का उपयोग कर रहे हैं, तो यह अब यूनिट परीक्षण नहीं है। यह अभी भी एक पूरी तरह से वैध एकीकरण परीक्षण हो सकता है, लेकिन यह एक इकाई परीक्षण नहीं है। –

+1

समस्या यह है कि डेटाबेस बनाने और नष्ट करने में समय लगता है। मैं अंततः एक आंखों के झपकी में हजारों परीक्षण चलाता हूं, हर बार जब मैं बदलाव करता हूं। मैं अपने परीक्षण चलाने के लिए डेटाबेस और अनुप्रयोग उदाहरण खड़ा नहीं करना चाहता हूं। –