কীভাবে ইনজেকশনযোগ্য কোড পরীক্ষা করতে হবে?


13

সুতরাং আমার কম্পিউটারে নিম্নলিখিত কোডটি টুকরো টুকরো ব্যবহার করে। আমরা বর্তমানে ইউনিট টেস্টগুলি অতীতের প্রতিবিম্বিতভাবে লিখছি (কখনই আমার তর্ক ছিল না তার চেয়ে আরও ভাল দেরি), তবে আমি দেখতে পাচ্ছি না এটি কীভাবে পরীক্ষামূলক হবে?

public function validate($value, Constraint $constraint)
{
    $searchEntity = EmailAlertToSearchAdapter::adapt($value);

    $queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords());
    $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity);
    $query = $adapter->setupBuilder()->build();

    $totalCount = $this->advertType->count($query);

    if ($totalCount >= self::MAXIMUM_MATCHING_ADS) {
        $this->context->addViolation(
            $constraint->message
        );
    }
}

ধারণামূলকভাবে এটি যে কোনও ভাষার ক্ষেত্রে প্রযোজ্য হওয়া উচিত তবে আমি পিএইচপি ব্যবহার করছি। কোডটি কেবল কোনও Searchবস্তুর উপর ভিত্তি করে একটি ইলাস্টিক অনুসন্ধান ক্যোয়ারী অবজেক্ট তৈরি করে , যা ঘুরিয়ে দিয়ে কোনও EmailAlertঅবজেক্টকে বন্ধ করে দেয় । এগুলি Searchএবং EmailAlertকেবল পপো O

আমার সমস্যা আমি দেখছি না আমি কিভাবে খুঁজে উপহাস করতে পারেন SearcherFactory(যা স্ট্যাটিক পদ্ধতি ব্যবহার করে), আর SearchEntityToQueryAdapter, যা থেকে ফলাফল দরকার SearcherFactory::getSearchDirector এবংSearch উদাহরণস্বরূপ। কোনও পদ্ধতির মধ্যে ফলাফল থেকে তৈরি এমন কীভাবে আমি ইনজেক্ট করব? সম্ভবত কিছু ডিজাইনের ধরণ আছে যা সম্পর্কে আমি অবগত নই?

কোন সাহায্যের জন্য ধন্যবাদ!


@ ডকব্রাউন এটি $this->context->addViolationকলের অভ্যন্তরে, এর অভ্যন্তরে ব্যবহৃত হচ্ছে if
iLikeBreakfast

1
দুঃখিত, অন্ধ হয়ে থাকতে হবে।
ডক ব্রাউন

সুতরাং সব :: স্ট্যাটিকস হয়?
ইওয়ান

হ্যাঁ, পিএইচপি- ::তে স্থির পদ্ধতির জন্য।
অ্যান্ডি

@ ইভান হ্যাঁ, ::ক্লাসে একটি স্ট্যাটিক পদ্ধতি কল করে।
iLikeBreakfast

উত্তর:


11

কিছু প্যাসিবিলাইট রয়েছে, কীভাবে staticপিএইচপি-তে পদ্ধতিগুলি উপহাস করবেন , আমি সবচেয়ে ভাল সমাধানটি ব্যবহার করেছি AspectMock গ্রন্থাগারটি, যা সুরকারের মাধ্যমে টানা যেতে পারে (স্ট্যাটিক পদ্ধতিগুলিকে কীভাবে উপহাস করা যায় ডকুমেন্টেশন থেকে বেশ বোঝা যায়)।

যাইহোক, এটি কোনও সমস্যার জন্য শেষ মুহূর্তের ফিক্স যা অন্যভাবে স্থির করা উচিত।

আপনি যদি এখনও কোয়েরি পরিবর্তনের জন্য দায়বদ্ধ স্তরটি পরীক্ষা করতে চান তবে কীভাবে এটি করবেন এটির একটি দুর্দান্ত উপায় আছে।

আমি এখনই ধরে নিচ্ছি যে validateপদ্ধতিটি কোনও শ্রেণীর একটি অংশ, খুব দ্রুত সমাধানের জন্য, যা আপনাকে আপনার সমস্ত স্ট্যাটিক কলকে উদাহরণস্বরূপ কল হিসাবে রূপান্তর করতে পারে না, তা হল আপনার স্ট্যাটিক পদ্ধতির জন্য প্রক্সি হিসাবে অভিনয় করে এমন ক্লাস তৈরি করা এবং এই প্রক্সিগুলিকে ক্লাসে ইনজেক্ট করা to যা পূর্বে স্থির পদ্ধতি ব্যবহার করে।

class EmailAlertToSearchAdapterProxy
{
    public function adapt($value)
    {
        return EmailAlertToSearchAdapter::adapt($value);
    }
}

class SearcherFactoryProxy
{
    public function getSearchDirector(array $keywords)
    {
        return SearcherFactory::getSearchDirector($keywords);
    }
}

class ClassWithValidateMethod
{
    private $emailProxy;
    private $searcherProxy;

    public function __construct(
        EmailAlertToSearchAdapterProxy $emailProxy,
        SearcherFactoryProxy $searcherProxy
    )
    {
        $this->emailProxy = $emailProxy;
        $this->searcherProxy = $searcherProxy;
    }

    public function validate($value, Constraint $constraint)
    {
        $searchEntity = $this->emailProxy->adapt($value);

        $queryBuilder = $this->searcherProxy->getSearchDirector($searchEntity->getKeywords());
        $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity);
        $query = $adapter->setupBuilder()->build();

        $totalCount = $this->advertType->count($query);

        if ($totalCount >= self::MAXIMUM_MATCHING_ADS) {
            $this->context->addViolation(
                $constraint->message
            );
        }
    }
}

এটি নিখুঁত! প্রক্সির কথাও ভাবেননি। ধন্যবাদ!
iLikeBreak ব্রেকফাস্ট 20'16

2
আমি বিশ্বাস করি মাইকেল ফেদার তার "লিগ্যাসি কোডের সাথে কার্যকরভাবে কাজ করা" বইটিতে এটি "র‌্যাপ স্ট্যাটিক" কৌশল হিসাবে উল্লেখ করেছেন।
রাবারডাক

1
@ রাবারডাক আমি পুরোপুরি নিশ্চিত নই যে একে প্রক্সি বলা হয়, সত্যি কথা। যতক্ষণ আমি এটির ব্যবহারটি মনে করতে পারি তার জন্য এটিই আমাকে বলা হয়েছিল, মিঃ ফেদারের নামটি সম্ভবত আরও ভালভাবে উপযোগী, যদিও আমি বইটি পড়িনি।
অ্যান্ডি

1
ক্লাস নিজেই অবশ্যই একটি "প্রক্সি"। নির্ভরতা ভাঙার কৌশলটিকে "মোড়ানো স্থির" আইআইআরসি বলা হয়। আমি বইটি অত্যন্ত সুপারিশ করি recommend আপনি এখানে সরবরাহ করেছেন এমনভাবে রত্নগুলি পূর্ণ।
রাবারডাক

5
যদি আপনার কাজটিতে কোডে ইউনিট পরীক্ষা যুক্ত করা জড়িত থাকে, তবে "উত্তরাধিকার কোডের সাথে কাজ করা" একটি দৃ strongly়ভাবে প্রস্তাবিত বই। "লিগ্যাসি কোড" এর তাঁর সংজ্ঞাটি "ইউনিট টেস্টবিহীন কোড", পুরো বইটি হ'ল বিদ্যমান অনির্ধারিত কোডগুলিতে ইউনিট পরীক্ষা যুক্ত করার কৌশল in
ইটারেম 20'16 এ 12

4

প্রথমত, আমি এটিকে পৃথক পদ্ধতিতে বিভক্ত করার পরামর্শ দেব:

public function validate($value, Constraint $constraint)
{
    $totalCount = QueryTotal($value);
    ShowMessageWhenTotalExceedsMaximum($totalCount,$constraint);
}

private function QueryTotal($value)
{
    $searchEntity = EmailAlertToSearchAdapter::adapt($value);

    $queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords());
    $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity);
    $query = $adapter->setupBuilder()->build();

    return $this->advertType->count($query);
}

private function ShowMessageWhenTotalExceedsMaximum($totalCount,$constraint)
{
    if ($totalCount >= self::MAXIMUM_MATCHING_ADS) {
        $this->context->addViolation(
            $constraint->message
        );
    }
}

এটি আপনাকে এমন পরিস্থিতিতে ফেলে দেয় যেখানে আপনি সেই দুটি নতুন পদ্ধতিটিকে জনসাধারণ এবং ইউনিট পরীক্ষা QueryTotalএবং ShowMessageWhenTotalExceedsMaximumস্বতন্ত্রভাবে বিবেচনা করতে পারেন । আপনি এখানে কেবলমাত্র ইলাস্টিক অনুসন্ধানটি পরীক্ষা করতে পারবেন বলে এখানে একটি কার্যকর বিকল্পটি আসলে মোটেও একক পরীক্ষার QueryTotalনয়। এর জন্য ইউনিট পরীক্ষা লেখার ShowMessageWhenTotalExceedsMaximumবিষয়টি সহজ হওয়া উচিত এবং এটি আরও অর্থপূর্ণ হওয়া উচিত, যেহেতু এটি আসলে আপনার ব্যবসার যুক্তি পরীক্ষা করে।

তবে, আপনি যদি সরাসরি "বৈধতা" পরীক্ষা করতে পছন্দ করেন তবে ক্যোয়ারী ফাংশনটিকে নিজেকে "বৈধকরণ" (একটি ডিফল্ট মান সহ $this->QueryTotal) হিসাবে পরামিতি হিসাবে বিবেচনা করার বিষয়টি বিবেচনা করুন , এটি আপনাকে কোয়েরি ফাংশনটিকে উপহাস করার অনুমতি দেবে। আমি পিএইচপি সিনট্যাক্স ঠিক পেয়েছি কিনা তা নিশ্চিত নই, তাই যদি আমি না করি তবে দয়া করে এটিকে "সিউডো কোড" হিসাবে পড়ুন:

public function validate($value, Constraint $constraint, $queryFunc=$this->QueryTotal)
{
    $totalCount =  $queryFunc($value);
    ShowMessageWhenTotalExceedsMaximum($totalCount,$constraint);
}

আমি ধারণাটি পছন্দ করি, তবে আমি এই জাতীয় পদ্ধতিগুলি পাস করার পরিবর্তে কোডটিকে আরও অবজেক্ট-ভিত্তিক রাখতে চাই।
iLikeBreakfast

@ iLikeBreakfast আসলে অন্য যে কোনও বিষয় নির্বিশেষে এই পদ্ধতিটি ভাল। একটি পদ্ধতি যতটা সম্ভব সংক্ষিপ্ত হওয়া উচিত এবং একটি জিনিস এবং একটি জিনিস ভালভাবে করা উচিত (চাচা বব, ক্লিন কোড )। এটি পড়া সহজ করে তোলে, বোঝা সহজ এবং পরীক্ষা করা সহজ করে তোলে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.