অ্যাবস্ট্রাক্ট ক্লাস পরীক্ষা করা হচ্ছে


144

আমি কীভাবে পিএইচপিউনিট দিয়ে বিমূর্ত শ্রেণীর কংক্রিট পদ্ধতিগুলি পরীক্ষা করব?

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


10
সম্ভবত আপনি গৃহীত উত্তর পরিবর্তন বিবেচনা করা উচিত।
জ্যাকব

1
হতে পারে স্ট্যাকওভারফ্লো . com/a/2947823/23963 সহায়তা করবে।
নাইজেল থর্ন

উত্তর:


240

অ্যাবস্ট্রাক্ট ক্লাসগুলির ইউনিট টেস্টিংয়ের অর্থ ইন্টারফেসটি পরীক্ষা করা প্রয়োজন হয় না, কারণ অ্যাবস্ট্রাক্ট ক্লাসগুলিতে কংক্রিটের পদ্ধতি থাকতে পারে এবং এই কংক্রিটের পদ্ধতিগুলি পরীক্ষা করা যেতে পারে।

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

ব্যক্তিগতভাবে, আমি পিএইচপিউইনিত ব্যবহার করি এবং এটি আপনাকে এ জাতীয় জিনিস পরীক্ষায় সহায়তা করতে স্টাবস এবং মক অবজেক্টস বলে।

পিএইচপিউনিট ম্যানুয়াল থেকে সোজা :

abstract class AbstractClass
{
    public function concreteMethod()
    {
        return $this->abstractMethod();
    }

    public abstract function abstractMethod();
}

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $stub = $this->getMockForAbstractClass('AbstractClass');
        $stub->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(TRUE));

        $this->assertTrue($stub->concreteMethod());
    }
}

মক অবজেক্ট আপনাকে বেশ কয়েকটি জিনিস দেয়:

  • আপনার বিমূর্ত শ্রেণীর কংক্রিট প্রয়োগের প্রয়োজন নেই এবং পরিবর্তে স্টাব দিয়ে পালাতে পারেন
  • আপনি কংক্রিট পদ্ধতিতে কল করতে পারেন এবং দৃ as়ভাবে দাবি করতে পারেন যে তারা সঠিকভাবে সম্পাদন করে
  • যদি কংক্রিট পদ্ধতিটি প্রয়োগহীন (বিমূর্ত) পদ্ধতির উপর নির্ভর করে, আপনি উইল () পিএইচপিউনিট পদ্ধতিতে রিটার্ন মানটি আটকে দিতে পারেন

38

এটা একটা ভালো প্রশ্ন. আমি এটিও খুঁজছিলাম
ভাগ্যক্রমে, পিএইচপিউইনেটের ইতিমধ্যে getMockForAbstractClass()এই ক্ষেত্রে পদ্ধতি রয়েছে

protected function setUp()
{
    $stub = $this->getMockForAbstractClass('Some_Abstract_Class');
    $this->_object = $stub;
}

গুরুত্বপূর্ণ:

নোট করুন যে এর জন্য PHPUnit> 3.5.4.4 প্রয়োজন। পূর্ববর্তী সংস্করণগুলিতে একটি বাগ ছিল ।

নতুন সংস্করণে আপগ্রেড করতে:

sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit

আকর্ষণীয় মনে হচ্ছে তবে আপনি মোক এর বিরুদ্ধে পরীক্ষা করছেন? পরীক্ষাগুলি কেমন হবে? আইই: পরীক্ষার ক্ষেত্রে মোককে প্রসারিত করা এবং বর্ধিত পরীক্ষা শ্রেণির বিরুদ্ধে পরীক্ষা করা?
স্টেফগোসেলিন

34

এটি উল্লেখ্য করা উচিত যে পিএইচপি হিসাবে 7 বেনাম শ্রেণীর জন্য সমর্থন যুক্ত করা হয়েছে। এটি আপনাকে একটি বিমূর্ত শ্রেণীর জন্য একটি পরীক্ষা স্থাপনের জন্য একটি অতিরিক্ত অ্যাভিনিউ দেয় যা PHPUnit- নির্দিষ্ট কার্যকারিতার উপর নির্ভর করে না।

class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var AbstractClass
     */
    private $testedClass;

    public function setUp()
    {
        $this->testedClass = new class extends AbstractClass {

            protected function abstractMethod()
            {
                // Put a barebones implementation here
            }
        };
    }

    // Put your tests here
}

4
এই জন্য আপনাকে ধন্যবাদ! পিএইচপিউইনিতে একটি বেনাম শ্রেণি ব্যবহার করে আমার বিভিন্ন পরীক্ষা তৈরিতে আমাকে অনেক নমনীয়তা দিয়েছে।
এলিস ওয়ান্ডার

1

ইরান, আপনার পদ্ধতিটি কাজ করা উচিত, তবে এটি আসল কোডের আগে পরীক্ষা লেখার প্রবণতার বিরুদ্ধে যায়।

আমি যা পরামর্শ দেব তা হ'ল প্রশ্নে বিমূর্ত শ্রেণীর একটি নন-অ্যাবস্ট্রাক্ট সাবক্লাসের কাঙ্ক্ষিত কার্যকারিতা সম্পর্কে আপনার পরীক্ষাগুলি লিখুন, তারপরে বিমূর্ত শ্রেণি এবং বাস্তবায়নকারী সাবক্লাস উভয়ই লিখুন এবং শেষ পর্যন্ত পরীক্ষাটি চালান।

আপনার পরীক্ষাগুলি স্পষ্টত বিমূর্ত শ্রেণীর সংজ্ঞায়িত পদ্ধতিগুলি পরীক্ষা করা উচিত, তবে সর্বদা সাবক্লাসের মাধ্যমে।


আমি একটি স্বেচ্ছাচারিত উত্তর হিসাবে পাই: আপনার একটি বিমূর্ত শ্রেণি আছে 'এ' এর একটি সাধারণ 'ফু ()' পদ্ধতি রয়েছে। এই 'foo ()' পদ্ধতিটি সামগ্রিকভাবে সমস্ত 'বি' এবং 'সি' শ্রেণিতে ব্যবহৃত হচ্ছে, উভয়ই 'এ' থেকে প্রাপ্ত। 'ফু ()' পরীক্ষা করার জন্য আপনি কোন ক্লাসটি বেছে নেবেন?
ব্যবহারকারীর 3790897

1

নেলসনের উত্তরটি ভুল।

বিমূর্ত শ্রেণীর জন্য তাদের সমস্ত পদ্ধতি বিমূর্ত হতে হবে না।

বাস্তবায়িত পদ্ধতিগুলি আমাদের যা পরীক্ষা করতে হবে।

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

চিয়ার্স।


0

আপনি যদি ইতিমধ্যে বিমূর্ত শ্রেণিতে প্রয়োগ করা পদ্ধতিগুলি সম্পর্কে ইউনিট পরীক্ষা করতে কেবল বিমূর্ত শ্রেণিকে সাবক্লাস করতে না চান তবে আপনার কাঠামো আপনাকে বিমূর্ত ক্লাসগুলি উপহাস করার অনুমতি দেয় কিনা তা দেখতে আপনি চেষ্টা করতে পারেন ।

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