2017-03-03 8 views
5

on_commit फ़ंक्शन को वर्तमान लेनदेन के बाद एक क्रिया (जैसे एक सेलेरी कार्य) को ट्रिगर करने में सक्षम होने के लिए Django 1.9 में जोड़ा गया है।डाटाबेस को साफ़ किए बिना Django on_commit हुक का परीक्षण कैसे करें?

वे बाद में in the docs का उल्लेख करते हैं कि किसी को उस फ़ंक्शन पर भरोसा करने वाली सुविधाओं का परीक्षण करने के लिए TransactionTestCase का उपयोग करना चाहिए। हालांकि, TestCase (जो लेनदेन का उपयोग करता है और उन्हें वापस रोल करता है) के विपरीत, TransactionTestCase प्रत्येक परीक्षण के बाद पूरे डेटाबेस को खाली करता है।

दुर्भाग्यवश, मेरे पास डेटा माइग्रेशन है जो डेटाबेस के अंदर कुछ उपयोगी डेटा प्रीलोड करता है, जिसका अर्थ है कि पहले परीक्षण डेटाबेस के बाद साफ़ होने के बाद और परीक्षण नहीं करते हैं।

with mock.patch.object(django.db.transaction, 'on_commit', lambda t: t()): 
    test_something() 

वहाँ एक बेहतर तरीका है:

मैं on_commit मजाक से एक गंदा चाल का सहारा समाप्त हो गया?

+3

वास्तव में अपने वैकल्पिक हल है कि बुरा नहीं है: इस लेख की जाँच करें। और मैं 'ट्रांज़ेक्शनटेस्टकेस' का उपयोग नहीं करना चाहता क्योंकि यह मेरे उपयोगकेस (बड़े 'सेटअप और फिक्स्चर के बहुत सारे) के लिए धीमा है। – Palasaty

उत्तर

0

मेरे मन में दो संभावनाएं हैं:

  1. रूप this अनुभाग का कहना है post_migrate फ्लश के बाद उत्सर्जित है, तो आप
  2. आप TransactionTestCase उपवर्ग और लागू अपने _fixture_teardown (आप देख सकते हैं कि कर सकते हैं कुछ उपयोगी डेटा पहले से लोड होने प्रदर्शन कर सकते हैं विधि के बहुत अंत में फ्लश कहा जाता है)।

यदि आपका माइग्रेशन बहुत महंगा नहीं है और दूसरा है तो मैं शायद पहले के साथ रहूंगा।

+0

' post_migrate' सिग्नल का उपयोग करना एक अच्छा विचार है। मैं देखूंगा कि क्या मैं अपने डेटा माइग्रेशन को इस में परिवर्तित कर सकता हूं क्योंकि यह समग्र रूप से अधिक क्लीनर लगता है! –

2

बस run_and_clear_commit_hooks में पारिवारिक कार्रवाइयों को निष्पादित करने के लिए टेस्टकेस और नकली प्रतिबद्धता का उपयोग करना जारी रखें।

https://medium.com/gitux/speed-up-django-transaction-hooks-tests-6de4a558ef96

+0

यह एक दिलचस्प हैक है, इसलिए अपवित्र है, लेकिन मैं आंतरिक Django विधियों का उपयोग करने से सावधान रहूंगा ताकि आप उन्नयन के दौरान मुद्दों के साथ समाप्त हो जाएं ... –

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