سؤال

وبينما كان يحاول الحصول على مصدر برنامج إرث تحت الاختبار، جئت عبر كائن أن يفعل ما يلي:

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = new Bar();
        // [lots more code]
    }
}

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

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = $this->getBarInstance();
        // [lots more code]
    }

    protected function getBarInstance()
    {
        return new Bar();
    }
}

وحاولت اختباره عن طريق الاختبار PHPUnit التالية:

class FooTest extends PHPUnit_Framework_TestCase
{
    public function testInstance()
    {

        $bar = $this->getMock('Bar');
        $foo = $this->getMock('Foo', array('getBarInstance'));
        $foo->expects($this->any())
            ->method('getBarInstance')
            ->will($this->returnValue($bar));

    }

}

ولكن هذا لا يعمل - ويسمى منشئ فو () قبل بلدي -> تتوقع () يضاف، وبالتالي فإن طريقة سخر getBarInstance () إرجاع قيمة خالية

.

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

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

المحلول

استخدم حجة $callOriginalConstructor من getMock(). تعيين إلى false. إنها حجة الخامسة من طريقة. البحث عنه هنا: HTTP: // شبكة الاتصالات العالمية .phpunit.de / دليل / الحالي / EN / api.html # api.testcase.tables.api

في الواقع، على عقد. تريد تمرير همية لوهمية؟ إذا كنت تريد حقا هذا، ثم استخدم الوسيطة الثالثة getMock التي تمثل الحجج إلى منشئ. هناك يمكنك تمرير همية من Bar لوهمية من Foo.

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