2014-07-23 9 views
9

मैंने Django-rest-framework view sets और राउटर का उपयोग करके अपना डेटाबेस मॉडल उजागर किया है, और मैं इसके लिए यूनिट परीक्षण लिखने की कोशिश कर रहा हूं।django-rest-framework api के लिए यूनिट परीक्षण कैसे लिखें?

यहाँ मेरी एपीआई और परीक्षण कोड

Viewsets.py

class Model1ViewSet(viewsets.ReadOnlyModelViewSet): 

    model = Model1 
    serializer_class = Model1Serializer 
    filter_class = Model1Filter 
    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter) 
    ordering = ('id', 'cl1') 

Serializer.py

class Model1Serializer(serializers.HyperlinkedModelSerializer): 
    chip = serializers.HyperlinkedRelatedField(view_name="some-detail") 

    class Meta: 
     model = Model1 
     fields = ('url', 'id', 'cl1', 'cl2', 'cl3', 'cl4') 
     depth = 1 

यूनिट परीक्षण

from rest_framework.test import APIClient 

class TestModel1Api(unittest.TestCase): 

    def setUp(self): 
     self.client = APIClient() 

    def test_Model1_list(self): 
     response = self.client.get(reverse('Model1-list')) 
     self.assertEqual(response.status_code, status.HTTP_200_OK) 

    def test_Model1_detail(self): 
     mm_objs = Model1.objects.all() 
     if mm_objs: 
      response = self.client.get(reverse('Model1-detail', args=[mm_objs[0].id])) 
      self.assertEqual(response.status_code, status.HTTP_200_OK) 

हैं जो मुझे नहीं चाहिए डेटाबेस से कनेक्ट करने के लिए इकाई परीक्षण के लिए क्योंकि यह एकीकरण परीक्षण के तहत आता है।

क्या डेटाबेस को नकल करने का कोई तरीका है? मुझे पता है कि मानक दृश्य कार्यों के लिए मॉकिंग कैसे लागू करें, लेकिन यहां मॉकिंग काम नहीं कर रही है।

  1. मेरे आरईएसटी-एपीआई के लिए यूनिट परीक्षण कैसे लिखें?
  2. मेरे यूनिट-परीक्षण में डेटाबेस का नकल कैसे करें?
+0

मैं इस परियोजना से परिचित नहीं हूं इसलिए मैं विशेष रूप से आपकी मदद नहीं कर सकता हूं लेकिन दस्तावेज में यह देखने के लिए कि कौन सा वर्ग/फ़ंक्शन वास्तव में डेटाबेस से कनेक्ट हो रहा है और आपके परीक्षणों में नकली है। –

+1

यदि आप एपीआई का परीक्षण करना चाहते हैं तो आप इकाई परीक्षण का उपयोग नहीं कर सकते हैं। एपीआई का परीक्षण करने का अर्थ है परीक्षण को कॉल करना और परीक्षण डेटाबेस से अच्छी तरह से गठित डेटा प्राप्त करना। जैसा कि आपने लिखा था यह एक एकीकरण परीक्षण होगा। इकाई और एकीकरण परीक्षण के बीच का अंतर न केवल डेटाबेस को छू रहा है या नहीं। – Norman8054

उत्तर

2

जब आप manage.py test चलाते हैं तो आपके डेटाबेस का आधार बनाया जाएगा लेकिन इसमें कोई डेटा नहीं है। ऐसा करने के लिए आप केवल आवश्यक वस्तुओं को स्वयं बना सकते हैं या FactoryBoy

पर कुछ उपयोग करें, बस ध्यान रखें कि डेटाबेस एक नया प्रारंभ करते समय पिछले परीक्षण विधियों से डेटा साफ़ कर दिया गया है।

+1

मुझे उत्सुकता है कि कोई डेटाबेस के उपयोग से कैसे बच सकता है। फैक्टरी बॉय में आप आदर्श रूप से डेटाबेस में ऑब्जेक्ट्स को बनाए रखने से रोकने के लिए व्यंजनों के लिए '.make()' के बजाय '.prepare()' जैसे कुछ का उपयोग कर सकते हैं, लेकिन फिर जब आप दृश्य को कॉल करने के लिए जाते हैं तो वे दिखाई नहीं देंगे ... –

+0

फैक्टरी बॉय .build() विधि का समर्थन करता है जो ऑब्जेक्ट बनाता है लेकिन यह डेटाबेस में सहेजा नहीं गया है और इसमें 'आईडी' सेट नहीं होगा। आप कुछ प्रारंभिक डेटा बनाने में सक्षम हो सकते हैं जो परीक्षण डेटाबेस निर्माण के दौरान लोड किया जाएगा और जब भी आप एक नई टेस्ट विधि चलाते हैं तो आपको टेबल को पॉप्युलेट नहीं करना होगा (आप एक ही 'व्यक्ति' ऑब्जेक्ट को कई बार उपयोग कर सकते हैं) लेकिन एक बेहतर समाधान नहीं मिला – timop

+0

timop: आह हाँ, आप सही हैं। मैं इस उदाहरण में मॉडल माँ के बारे में सोच रहा था और मुझे एपीआई मिश्रित हो गया। अनुवर्ती कार्रवाई के लिए धन्यवाद। –

संबंधित मुद्दे