2013-07-16 11 views
13

मैं अपने Django विचारों का परीक्षण करने की कोशिश कर रहा हूँ। यह दृश्य टेम्पलेट के लिए एक क्वेरीसमूह गुजरता है:मैं Django QuerySets का परीक्षण कैसे करूं?

def merchant_home(request, slug): 
    merchant = Merchant.objects.get(slug=slug) 
    product_list = merchant.products.all() 
    return render_to_response('merchant_home.html', 
          {'merchant': merchant, 
          'product_list': product_list}, 
          context_instance=RequestContext(request)) 

और परीक्षण:

def test(self): 
    "Merchant home view should send merchant and merchant products to the template" 
    merchant = Merchant.objects.create(name='test merchant') 
    product = Product.objects.create(name='test product', price=100.00) 
    merchant.products.add(product) 

    test_client = Client() 
    response = test_client.get('/' + merchant.slug) 
    # self.assertListEqual(response.context['product_list'], merchant.products.all()) 
    self.assertQuerysetEqual(response.context['product_list'], merchant.products.all()) 

संपादित मैं self.assertQuerysetEqual उपयोग कर रहा हूँ self.assertListEqual के बजाय। दुर्भाग्य से यह अभी भी काम नहीं करता है, और टर्मिनल दर्शाता है कि यह: ['<Product: Product object>'] != [<Product: Product object>]


assertListEqual को जन्म देती है: 'क्वेरीसमूह' ऑब्जेक्ट कोई विशेषता 'अंतर' है assertEqual या तो काम नहीं करता है, हालांकि self.assertSetEqual(response.context['product_list'][0], merchant.products.all()[0]) पारित करता है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि QuerySets अलग-अलग ऑब्जेक्ट्स हैं, भले ही उनमें एक ही मॉडल उदाहरण हों।

मैं कैसे परीक्षण करूं कि दो क्वेरीसेट्स में एक ही डेटा है? मैं हर सही ढंग से यह परीक्षण कर रहा हूँ? यह मेरा चौथा दिन है जो डैंजो सीख रहा है, इसलिए यदि संभव हो तो मैं सर्वोत्तम प्रथाओं को जानना चाहता हूं। धन्यवाद।

उत्तर

15

assertQuerysetEqual का उपयोग करें, जो आपके लिए दो क्वेरीसेट की तुलना करने के लिए बनाया गया है। अपने परीक्षणों में उपलब्ध होने के लिए आपको Django के django.test.TestCase को उप-वर्ग करने की आवश्यकता होगी।

+6

बहुत बढ़िया, यह उपयोगी है, हालांकि अब मेरा परीक्षण इस वजह से विफल रहता है: AssertionError: [ '< उत्पाद: उत्पाद ऑब्जेक्ट> ']! = [<उत्पाद: उत्पाद ऑब्जेक्ट>] मुझे लगता है कि केवल एक ही अंतर यह है कि पहले उत्पाद ऑब्जेक्ट के आसपास उद्धरण हैं। वे दोनों क्लास QuerySet – jz999

+0

नए प्रश्न कोड के साथ अपना प्रश्न अपडेट करें। :) – girasquid

+0

बस किया गया, धन्यवाद – jz999

5

मुझे बस एक ही समस्या थी। assertQuerysetEqual का दूसरा तर्क अपेक्षित repr() एस की स्ट्रिंग के रूप में सूचीबद्ध होना चाहिए।

self.assertQuerysetEqual(c1.tags.all(), ["<Tag: t1>", "<Tag: t2>"], ordered=False) 
+1

देखें http://stackoverflow.com/a/14189017/678486 (पूर्ण प्रकटीकरण यह मेरा जवाब है)। –

1

एक वैकल्पिक, लेकिन जरूरी नहीं कि बेहतर, विधि (एक दृश्य में परीक्षण के संदर्भ में, उदाहरण के लिए) इस प्रकार दिखाई देंगे जब pytest का उपयोग कर:

all_the_things = Things.objects.all() 
assert set(list(response.context_data['all_the_things'])) == set(list(all_the_things)) 
यहाँ Django टेस्ट स्वीट से एक उदाहरण है

यह इसे एक सूची में परिवर्तित करता है, फिर एक सेट, जो सीधे किसी अन्य सेट के साथ तुलनीय है। set के व्यवहार से सावधान रहें, हालांकि यह वही नहीं हो सकता है जो आप चाहते हैं क्योंकि यह डुप्लीकेट को हटा देगा।

1

डिफ़ॉल्ट रूप से, assertQuerysetEqual पहले तर्क पर repr() का उपयोग करता है, यही कारण है कि आपको क्वेरीसेट तुलना में तारों के साथ समस्याएं थीं।

इस हल करने के लिए, आप कर सकते हैं एक lambda समारोह है कि उपयोग नहीं करता है के साथ override the transform argumentrepr():

self.assertQuerysetEqual(queryset_1, queryset_2, transform=lambda x: x) 
संबंधित मुद्दे