سؤال

كيف يمكنني اختبار الطرق الملموسة لفئة مجردة مع phpunit؟

أتوقع أن يتعين علي إنشاء نوع من الكائنات كجزء من الاختبار. رغم ذلك ، ليس لدي أي فكرة عن أفضل الممارسات لهذا أو إذا سمح Phpunit بذلك.

هل كانت مفيدة؟

المحلول

لا يعني اختبار الوحدة للفئات المجردة اختبار الواجهة ، حيث يمكن أن تحتوي الفئات المجردة على طرق ملموسة ، ويمكن اختبار هذه الأساليب الملموسة.

ليس من غير المألوف ، عند كتابة بعض رمز المكتبة ، أن يكون لديك فئة أساسية معينة تتوقع تمديدها في طبقة التطبيق الخاصة بك. وإذا كنت ترغب في التأكد من اختبار رمز المكتبة ، فأنت بحاجة إلى وسائل لوضع طرق ملموسة للفئات المجردة.

أنا شخصياً أستخدم phpunit ، وقد تسمى كائنات كعباء وموهبة لمساعدتك في اختبار هذا النوع من الأشياء.

مباشرة من دليل phpunit:

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());
    }
}

كائن وهمي يمنحك العديد من الأشياء:

  • ليس عليك أن يكون لديك تنفيذ ملموس لفئة مجردة ، ويمكنك الابتعاد عن كعب
  • يمكنك استدعاء أساليب الخرسانة وتؤكد أنها تؤدي بشكل صحيح
  • إذا كانت طريقة ملموسة تعتمد على طريقة (مجردة) غير مفيدة ، فيمكنك تعبئة قيمة الإرجاع باستخدام طريقة Will () phpunit

نصائح أخرى

هذا سؤال جيد. لقد كنت أبحث عن هذا أيضًا.
لحسن الحظ ، لدى Phpunit بالفعل getMockForAbstractClass() طريقة لهذه الحالة ، على سبيل المثال

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

مهم:

لاحظ أن هذا يتطلب phpunit> 3.5.4. كان يوجد حشرة في الإصدارات السابقة.

للترقية إلى أحدث إصدار:

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

تجدر الإشارة إلى أنه اعتبارًا من دعم PHP 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
}

إيران ، يجب أن تعمل طريقتك ، لكنها تتعارض مع ميل كتابة الاختبار قبل الكود الفعلي.

ما أقترحه هو كتابة اختباراتك على الوظيفة المطلوبة للفئة الفرعية غير المجردة للفئة المجردة المعنية ، ثم اكتب كل من الفئة المجردة والفئة الفرعية المنفذة ، وأخيراً إجراء الاختبار.

من الواضح أن الاختبارات الخاصة بك يجب أن تختبر الطرق المحددة للفئة التجريدية ، ولكن دائمًا عبر الفئة الفرعية.

إجابة نيلسون خاطئة.

لا تتطلب الفصول التجريدية أن تكون جميع أساليبها مجردة.

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

ما يمكنك فعله هو إنشاء فئة من كبوت الرخوة المزيفة على ملف اختبار الوحدة ، وجعلها توسيع الفئة التجريدية وتنفيذ ما هو مطلوب فقط بدون وظائف على الإطلاق ، بالطبع ، واختبار ذلك.

هتافات.

إذا كنت لا ترغب في الفئة الفرعية الفئة المجردة فقط لإجراء اختبار الوحدة على الأساليب التي يتم تنفيذها في الفئة المجردة بالفعل ، فيمكنك محاولة معرفة ما إذا كان إطارك يسمح لك بذلك وهمية فصول تجريدية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top