আমি কীভাবে সরাসরি কোনও ড্রাইভার ড্রাইভারের কাছ থেকে কাস্টম জ্যাঙ্গো ম্যানেজ.পি কমান্ড কল করতে পারি?


174

আমি জ্যাঙ্গো ম্যানেজ.পি কমান্ডের জন্য একটি ইউনিট পরীক্ষা লিখতে চাই যা একটি ডাটাবেস টেবিলটিতে ব্যাকএন্ড অপারেশন করে। আমি সরাসরি কোড থেকে পরিচালনা কমান্ডটি কীভাবে আবেদন করব?

আমি টেস্ট.পি থেকে অপারেটিং সিস্টেমের শেলের কমান্ডটি কার্যকর করতে চাই না কারণ ম্যানেজ.পি টেস্ট (টেস্ট ডাটাবেস, টেস্ট ডামি ইমেল আউটবক্স, ইত্যাদি ...) ব্যবহার করে আমি টেস্ট পরিবেশটি সেট করতে পারি না use

উত্তর:


312

এই জাতীয় জিনিসগুলি পরীক্ষা করার সর্বোত্তম উপায় - কমান্ড থেকে স্বতন্ত্র ফাংশন বা শ্রেণিতে প্রয়োজনীয় কার্যকারিতা বের করুন। এটি অতিরিক্ত আদেশ ছাড়াই "কমান্ড এক্সিকিউশন স্টাফ" থেকে বিমূর্ততা এবং পরীক্ষা লিখতে সহায়তা করে।

তবে আপনি যদি কোনও কারণে লজিক ফর্ম কমান্ডটি ডিকুয়াল করতে না পারেন তবে আপনি কল_কম্যান্ড পদ্ধতিটি ব্যবহার করে যে কোনও কোড থেকে কল করতে পারেন :

from django.core.management import call_command

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

19
পরীক্ষারযোগ্য যুক্তি অন্য কোথাও রাখার জন্য +1 (মডেল পদ্ধতি? ম্যানেজার পদ্ধতি? স্বতন্ত্র ফাংশন?) যাতে আপনার কোনওভাবেই কল_কমন্ড যন্ত্রপাতিটি নিয়ে গণ্ডগোলের দরকার হয় না। কার্যকারিতা পুনরায় ব্যবহার করা সহজ করে তোলে।
কার্ল মেয়ার

36
এমনকি আপনি যুক্তিটি নিষ্ক্রিয় করলেও এই ফাংশনটি প্রয়োজনীয় আর্গুমেন্টের মতো আপনার কমান্ডের সুনির্দিষ্ট আচরণ পরীক্ষা করার জন্য এবং এটি আপনার লাইব্রেরি ফাংশন ডাইনিকে সত্যিকারের কাজ করে কিনা তা নিশ্চিত করার জন্য দরকারী।
ইগোর সোব্রেইরা

উদ্বোধনী অনুচ্ছেদ যে কোনও সীমানা পরিস্থিতিতে প্রযোজ্য । আপনার নিজস্ব বিজ লজিক কোডটি এমন কোনও কোডের বাইরে সরিয়ে নিন যা কোনও ব্যবহারকারীর মতো কোনও ইন্টারফেসে সীমাবদ্ধ থাকে। যাইহোক, আপনি কোডের লাইনটি লিখলে এটিতে একটি বাগ থাকতে পারে, সুতরাং পরীক্ষাগুলি অবশ্যই কোনও সীমানার পিছনে পৌঁছাতে হবে।
ফিলিপ

আমি মনে করি এটি call_command('check')পরীক্ষার জন্য সিস্টেম চেকগুলি কেটে যাচ্ছে তা নিশ্চিত করার জন্য এটি এমন কিছুর জন্য এখনও কার্যকর ।
অ্যাডাম বার্নস

22

কল_কম্যান্ড ট্রিকটি করার পরিবর্তে আপনি নিজের কাজটি চালিয়ে যেতে পারেন:

from myapp.management.commands import my_management_task
cmd = my_management_task.Command()
opts = {} # kwargs for your command -- lets you override stuff for testing...
cmd.handle_noargs(**opts)

10
কল_কমন্ডল স্ট্যান্ডিন, স্টাডআউট, স্টডারার ক্যাপচারের জন্য যখন সরবরাহ করে তখন আপনি কেন এটি করবেন? এবং ডকুমেন্টেশন যখন এটি করার সঠিক উপায়টি নির্দিষ্ট করে?
নৌকোডার

17
এটি একটি অত্যন্ত ভাল প্রশ্ন। ); তিন বছর আগে হয়তো, আমি আপনার জন্য একটি উত্তর ছিল হবে
Nate

1
ডিটো নাট - যখন তার উত্তর আমি দেড় বছর আগে পেয়েছিলাম - আমি কেবল এটির উপর নির্মিত ...
ড্যানি স্ট্যাপল

2
পোস্ট খনন করা, তবে আজ এটি আমাকে সহায়তা করেছে: আমি সবসময় আমার কোডবেসের সমস্ত অ্যাপ্লিকেশন ব্যবহার করি না (ব্যবহৃত জ্যাঙ্গো সাইটের উপর নির্ভর করে) এবং call_commandএটিকে লোড করার জন্য পরীক্ষিত অ্যাপ্লিকেশনটি প্রয়োজন INSTALLED_APPS। কেবল পরীক্ষার উদ্দেশ্যে এবং এটি ব্যবহারের জন্য অ্যাপটি লোড করার মধ্যে, আমি এটি বেছে নিয়েছি।
মিকৈল

call_commandসম্ভবত বেশিরভাগ লোকদের প্রথমে চেষ্টা করা উচিত। এই উত্তরটি আমাকে এমন একটি সমস্যা সমাধানে সহায়তা করেছে যেখানে আমাকে inspectdbকমান্ডটিতে ইউনিকোড টেবিলের নামগুলি পাস করতে হবে । পাইথন / বাশ কমান্ড লাইন আর্গকে এসকিআই হিসাবে ব্যাখ্যা করছিল এবং এটি get_table_descriptionজাঙ্গোর গভীরে কল বোমা ফেলছিল।
বিঘ_29

17

নিম্নলিখিত কোড:

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

... টার্মিনালে টাইপ করা নিম্নলিখিত কমান্ডগুলির সমান:

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

জ্যাঙ্গো ডক্স থেকে পরিচালিত পরিচালনা আদেশগুলি দেখুন ।


14

Call_command উপর জ্যাঙ্গো ডকুমেন্টেশন উল্লেখ যে ব্যর্থ হয় outথেকে আপনাকে পুনঃনির্দেশিত করা উচিত নয় sys.stdout। উদাহরণ কোডটি পড়তে হবে:

from django.core.management import call_command
from django.test import TestCase
from django.utils.six import StringIO
import sys

class ClosepollTest(TestCase):
    def test_command_output(self):
        out = StringIO()
        sys.stdout = out
        call_command('closepoll', stdout=out)
        self.assertIn('Expected output', out.getvalue())

1

নেটের উত্তরের ভিত্তিতে আমার কাছে এটি রয়েছে:

def make_test_wrapper_for(command_module):
    def _run_cmd_with(*args):
        """Run the possibly_add_alert command with the supplied arguments"""
        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")

এখানে সুবিধা হ'ল আপনি যদি অতিরিক্ত বিকল্প এবং অপ্টপার্স ব্যবহার করেন তবে এটি আপনার জন্য সাজিয়ে দেবে। এটি বেশ নিখুঁত নয় - এবং এটি এখনও পাইপ আউটপুট দেয় না - তবে এটি পরীক্ষার ডাটাবেস ব্যবহার করবে will এরপরে আপনি ডাটাবেস প্রভাবগুলির জন্য পরীক্ষা করতে পারেন।

আমি নিশ্চিত যে মিশেল ফোর্ডস মক মডিউলটি ব্যবহার করেছি এবং পরীক্ষার সময়কালে স্টেডআউট পুনর্বিবেচনার অর্থ আপনিও এই কৌশলটি থেকে আরও কিছু পেতে পারেন - আউটপুট পরীক্ষা করা, প্রস্থান পরিস্থিতি ইত্যাদি test


4
আপনি কেবল কল_কম্যান্ড ব্যবহার না করে এই সমস্ত সমস্যায় কেন যাবেন?
নৌকা কোডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.