Phpunit kullanarak bir kurucu bir bağımlılık Çıkarma

2 Cevap php

Test altındaki eski bir kod temeli almak için çalışırken, ben aşağıdaki bir nesneye rastlamak ettik:

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

Bu durumda bar bazı Bad Things örneğin yapan bir kurucusu vardır Bir veritabanına bağlanıyor. Ben bu yüzden böyle bir şey için değişti test altında bu Foo sınıf almak konsantre çalışıyorum:

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

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

Ve şu PHPUnit testi ile test çalıştılar:

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

    }

}

Ancak bu işe yaramazsa -> () eklendi beklediğini, bu yüzden alay getBarInstance () yöntemi null döndürür - Foo (yapıcısı) benim önce denir.

Sınıf Kurucular kullandığı yol refactor kalmadan bu bağımlılık bağlantısını kaldırırken herhangi bir yolu var mı?

2 Cevap

Ve $callOriginalConstructor değişken kullanarak getMock(). Bunu ayarlayın false. Bu yöntemin beşinci tartışma. Buraya bak: http://www.phpunit.de/manual/current/en/api.html#api.testcase.tables.api

Aslında, bekle. Bir mock bir mock geçmek istiyor? Eğer gerçekten bunu istiyorsan, o kurucu argümanlarını temsil getMock üçüncü argümanını kullanın. Orada Foo ve alay etmek Bar arasında alay iletebilirsiniz.