मैं यह सुनिश्चित करना चाहता हूं कि मैं अलगाव में मॉडल/ऑब्जेक्ट का परीक्षण कर रहा हूं न कि एक विशाल प्रणाली के रूप में।विदेशी कुंजी के साथ Django में मॉडल का परीक्षण कैसे करें
यदि मेरे पास ऑर्डर ऑब्जेक्ट है और इसमें ग्राहकों, भुगतान, ऑर्डर इटम्स इत्यादि के लिए विदेशी कुंजी हैं और मैं ऑर्डर कार्यक्षमता का परीक्षण करना चाहता हूं, तो मुझे उन सभी संबंधित डेटा के लिए फिक्स्चर बनाने की आवश्यकता है, या इसे कोड में बनाना है। मुझे लगता है कि मुझे वास्तव में क्या करना है, अन्य चीजों का मज़ाक उड़ा रहा है, लेकिन अगर मैं इन विदेशी कुंजी पर सवाल कर रहा हूं तो मुझे इसके लिए एक आसान (या संभव) समाधान नहीं दिख रहा है।
सामान्य समाधान (फिक्स्चर) वास्तव में मुझे एक समय में एक ऑब्जेक्ट का परीक्षण करने नहीं देते हैं। मुझे यकीन है कि यह आंशिक रूप से मेरे ऐप के कारण रास्ता युग्मित है।
मैं काम करने का मेरा मुख्य पद्धति के रूप में TDD को अपनाने के लिए मेरी darndest कोशिश कर रहा हूँ, लेकिन जिस तरह से चीजें Django के साथ काम करते हैं, ऐसा लगता है कि आप या तो बहुत तुच्छ इकाई परीक्षण, या इन बड़े पैमाने पर एकीकरण परीक्षण चला सकते हैं।
[संपादित करें] बेहतर स्पष्ट उदाहरण है और एक कुछ और विनम्रता
क्या मेरा मतलब है कि मैं लगते ही तुच्छ इकाई परीक्षण चलाने के लिए सक्षम होने के लिए है। मैंने लोगों को बहुत अच्छी तरह से परीक्षण और दानेदार मॉड्यूल के साथ देखा है। मुझे यकीन है कि इनमें से कुछ को खराब डिजाइन के पीछे किया जा सकता है।
उदाहरण:
मैं एक मॉडल फोन अपसैल जो एक उत्पाद मॉडल से जुड़ा हुआ है है। तब मेरे पास एक विकल्प मॉडल है जो अपसेल के बच्चे हैं (क्या आप चाहते हैं कि दरवाजा # 1, # 2, # 3 के पीछे क्या है)।
अपसेल मॉडल पर कई विधियां हैं जो टेम्पलेट को उनके विकल्पों से प्रस्तुत करने के लिए आवश्यक वस्तुओं को प्राप्त करती हैं। सबसे महत्वपूर्ण बात यह है कि यह प्रत्येक विकल्प के लिए एक यूआरएल बनाता है। यह कुछ स्ट्रिंग मैंगलिंग इत्यादि के माध्यम से करता है। अगर मैं Upsell.get_urls() विधि का परीक्षण करना चाहता हूं, तो मैं इसे फिक्स्चर में विकल्पों के मूल्यों पर निर्भर नहीं करना चाहता हूं, और मैं यह नहीं चाहता कि यह मूल्य के मूल्य पर निर्भर करे फिक्स्चर में उत्पाद।
अभी मैं परीक्षण के लिए सेटअप विधि में डीबी को पॉप्युलेट करता हूं, और यह डीजेगो हर बार लेनदेन को वापस करने के तरीके के साथ अच्छी तरह से काम करता है, लेकिन केवल सेटअप और आंसू के बाहर। यह काफी अच्छा काम करता है सिवाय इसके कि कुछ मॉडल सेट अप करने के लिए काफी जटिल हैं, जबकि मुझे वास्तव में केवल इसके लिए एक विशेषता प्राप्त करने की आवश्यकता है।
मैं आपको इसका उदाहरण नहीं दे सकता, क्योंकि मैं इसे पूरा नहीं कर सकता, लेकिन यहां वह चीज है जो मैं अब कर रहा हूं। असल में मैं एक संपूर्ण आदेश इनपुट करता हूं, ए/बी प्रयोग को संलग्न करता हूं, आदि। और यह उत्पाद, श्रेणियां इत्यादि की गणना नहीं कर रहा है जो सभी फिक्स्चर द्वारा स्थापित किए गए हैं। यह अतिरिक्त काम नहीं है जिसे मैं चिंतित करता हूं क्योंकि मैं एक समय में डेटाबेस-आधारित ऑब्जेक्ट का परीक्षण भी नहीं कर सकता। नीचे दिए गए टेस्ट महत्वपूर्ण हैं, लेकिन वे एकीकरण परीक्षण हैं। मैं प्रत्येक आइटम को अलग से परीक्षण करके इस तरह कुछ ऐसा करना चाहता हूं। जैसा कि आपने बताया, शायद मुझे डीबी से इतनी बारीकी से बंधे हुए ढांचे को नहीं चुना जाना चाहिए था। क्या किसी तरह का निर्भरता इंजेक्शन इस तरह से कुछ मौजूद है?
class TestMultiSinglePaySwap(TestCase):
fixtures = ['/srv/asm/fixtures/alchemysites.json','/srv/asm/fixtures/catalog.json','/srv/asm/fixtures/checkout_smallset.json','/srv/asm/fixtures/order-test-fixture.json','/srv/asm/fixtures/offers.json']
def setUp(self):
self.o = Order()
self.sp = SiteProfile.objects.get(pk=1)
self.c = Customer.objects.get(pk=1)
signals.post_save.disconnect(order_email_first, sender=Order)
self.o.customer = self.c
p = Payment()
p.cc_number = '4444000011110000'
p.cc_exp_month = '12'
p.cc_type = 'V'
p.cc_exp_year = '2020'
p.cvv2 = '123'
p.save()
self.o.payment = p
self.o.site_profile = self.sp
self.o.save()
self.initial_items = []
self.main_kit = Product.objects.get(pk='MOA1000D6')
self.initial_items.append(self.main_kit)
self.o.add_item('MOA1000D6', 1, False)
self.item1 = Product.objects.get(pk='MOA1041A-6')
self.initial_items.append(self.item1)
self.o.add_item('MOA1041A-6', 1, False)
self.item2 = Product.objects.get(pk='MOA1015-6B')
self.initial_items.append(self.item2)
self.o.add_item('MOA1015-6B', 1, False)
self.item3 = Product.objects.get(pk='STP1001-6E')
self.initial_items.append(self.item3)
self.o.add_item('STP1001-6E', 1, False)
self.swap_item1 = Product.objects.get(pk='MOA1041A-1')
def test_single_pay_swap_wholeorder(self):
o = self.o
swap_all_skus(o)
post_swap_order = Order.objects.get(pk = o.id)
swapped_skus = ['MOA1000D','MOA1041A-1','MOA1015-1B','STP1001-1E']
order_items = post_swap_order.get_all_line_items()
self.assertEqual(order_items.count(), 4)
pr1 = Product()
pr1.sku = 'MOA1000D'
item = OrderItem.objects.get(order = o, sku = 'MOA1000D')
self.assertTrue(item.sku.sku == 'MOA1000D')
pr2 = Product()
pr2.sku = 'MOA1015-1B'
item = OrderItem.objects.get(order = o, sku = 'MOA1015-1B')
self.assertTrue(item.sku.sku == 'MOA1015-1B')
pr1 = Product()
pr1.sku = 'MOA1041A-1'
item = OrderItem.objects.get(order = o, sku = 'MOA1041A-1')
self.assertTrue(item.sku.sku == 'MOA1041A-1')
pr1 = Product()
pr1.sku = 'STP1001-1E'
item = OrderItem.objects.get(order = o, sku = 'STP1001-1E')
self.assertTrue(item.sku.sku == 'STP1001-1E')
ध्यान दें कि मैं वास्तव में एक नकली ढांचा कभी नहीं इस्तेमाल किया है हालांकि मैं कोशिश की है (मेरे परीक्षण, लेकिन कोड में ही रूप में अच्छी तरह से परे)। तो मैं यहां मूल रूप से कुछ भी याद कर सकता हूं।
मुझे लगता है कि जब आप ने कहा, "वहाँ व्यापार मॉडल वर्ग और सतत मॉडल वर्ग के बीच कोई अंतर नहीं है" आप सही सिर पर कील मारा। Django आपको टेस्ट डेटाबेस विकल्प देता है और यह मॉकिंग के करीब है जैसा कि उम्मीद की जा सकती है (हालांकि वहां "नकली" डीबी बैकएंड हो सकता है जो केवल बाधाओं को लागू करेगा)। कम से कम अब मुझे पता है कि मैं कुछ ऐसा नहीं ढूंढ रहा हूं जो पहले ही लिखा गया है। – zenWeasel
आप डेविड क्रैमर के https://github.com/dcramer/mock-django बीटीडब्लू को भी देखना चाहते हैं, github पर नकली लाइब्रेरी का एक कांटा है: https://github.com/yujiabe/mock (अपडेट किया गया जून 2012) – Andrei
एफडब्ल्यूआईडब्ल्यू, मैंने मॉक और मॉक-डीजैगो के साथ कूदने की सलाह अपनाई है और मैंने जो कुछ करने का प्रयास किया था, उसे पूरा कर लिया है। मॉक लाइब्रेरी सीखने में थोड़ा सा सीखती है कि इसका सही तरीके से उपयोग कैसे किया जाए, लेकिन यह इसके लायक है। तो मैं बस अपडेट करना चाहता था कि सलाह के उन दो टुकड़े पैसे पर सही थे और 2-3 साल बाद मैं गैर-तुच्छ इकाई परीक्षणों को लिखने के लिए हर दिन उन तरीकों का उपयोग करता हूं। – zenWeasel