اذهب إلى المحتوى

السؤال

نشر

أريد أن أكتب اختبار وحدة Unit Test للأمر معين في manage.py والذي يقوم بعملية في جدول في قاعدة البيانات. كيف يمكنني استدعاء هذا الأمر مباشرة من داخل الكود؟

لا أرغب في تنفيذ الأمر على على shell الخاص بنظام التشغيل يدويًا لأنني حينها لن أستطيع استخدام بيئة الاختبار التي تم إعدادها باستخدام manage.py test.

لذلك أريد أن أعرف كيف يمكنني استدعاء أمر manage.py مخصص مباشرةً من داخل ملف اختبار test؟

Recommended Posts

  • 1
نشر

أفضل طريقة لاختبار مثل هذه الأشياء هي استخراج الوظائف المطلوبة من الأمر نفسه إلى دالة function أو فئة class قائمة بذاتها. يساعد ذلك على التجريد من تنفيذ الأوامر يدويًا وكتابة الاختبار دون متطلبات إضافية.

ويمكنك إستدعاء أي أمر من داخل الكود الخاص بك باستخدام التابع call_command كالتالي:

from django.core.management import call_command

call_command('flush', verbosity=0)
call_command('my_command', 'foo')
call_command('loaddata', 'test_data', verbosity=0)

يستخدم التابع call_command لاستدعاء أمر إدارة management command من داخل الكود، ويقبل مدخل name وهو الأمر الذي تريد تنفيذه، بالإضافة إلى args وهي المعاملات التي يجب إستخدامها مع هذا الأمر الذي تريد تنفيذه، بالإضافة إلى بعض الخيارات options التي تتحكم في طريقة تنفيذ الأمر مثل verbosity.

يمكنك أيضًا تخزين نتيجة تنفيذ هذا الأمر من خلال كتابة النتيجة في ملف على النحو التالي:

from django.core.management import call_command

with open('/path/to/command_output', 'w') as f:
    call_command('dumpdata', stdout=f)

حيث يقبل التابع call_command معامل باسم stdout و stderr ومن خلالهما يمكن تخزين أي نتائج أو أخطاء في ملفات.

  • 0
نشر

يمكنك استخدام call_command بسهولة لتنفيذ الاوامر من داخل الكود الخاص بك بسهوله كالتالي:

from django.core.management import call_command

call_command('my_command', 'foo', bar='baz')

حيث my_command هو اسم الأمر الذي تريد تنفيذه.

وكأمثله لاحظ الأكواد التاليه:

from django.core.management import call_command
call_command('test', 'myapp', verbosity=3, interactive=False)

حيث تنفذ تلك الأوامر تماما مثلما تستطيع تنفيذها بالطريقة التقليدية من ال terminal:

$ ./manage.py migrate myapp --noinput -v 3

كذلك عوضا عن أن تقوم بعمل  call_command  يمكنك تشغيل manage.py من داخل الكود ببساطة كالتالي:

from myapp.management.commands import my_management_task
cmd = my_management_task.Command()
opts = {} 
cmd.handle_noargs(**opts)

 

  • 0
نشر

بالإضافة الى الاجابات الأخرى يمكنك استخدام هذه الدالة

def make_test_wrapper_for(command_module):
    def _run_cmd_with(*args):
        "" "قم بتشغيل الأمر might_add_alert بالوسيطات المزودة" ""
        cmd = command_module.Command()
        (opts, args) = OptionParser(option_list=cmd.option_list).parse_args(list(args))
        cmd.handle(*args, **vars(opts))
    return _run_cmd_with

لاستخدامها كالتالي

from myapp.management import mycommand
cmd_runner = make_test_wrapper_for(mycommand)
cmd_runner("foo", "bar")

الميزة هنا هي أنك إذا استخدمت خيارات إضافية و OptParse ، فسيؤدي ذلك إلى حل المشكلة لك,ستستخدم قاعدة بيانات الاختبار ويمكنك بعد ذلك اختبار تأثيرات قاعدة البيانات.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...