SimpleTest "kısmi mocks" Eşdeğer

2 Cevap php

Ben PHPUnit için SimpleTest gelen bir sürü test geçirmek çalışıyorum ve SimpleTest en partial mocks için bir eşdeğer olup olmadığını merak ediyordum.

Güncelleme: Ben bu özellik mevcut olduğunu göstermektedir dokümanlar şey bulmak için görünmüyor olabilir, ama ben sadece bir alt sınıfını kullanabilirsiniz bana oluştu. Bu iyi ya da kötü bir fikir mi?

class StuffDoer {
    protected function doesLongRunningThing() {
        sleep(10);
        return "stuff";
    }
    public function doStuff() {
        return $this->doesLongRunningThing();
    }
}
class StuffDoerTest {
    protected function doesLongRunningThing() {
        return "test stuff";
    }
}
class StuffDoerTestCase extends PHPUnit_Framework_TestCase {
    public function testStuffDoer() {
        $sd = new StuffDoerTest();
        $result = $sd->doStuff();
        $this->assertEquals($result, "test stuff");
    }
}

2 Cevap

Bağlantılı sayfayı okuma, bir SimpleTest kısmi sahte yöntemlerden sadece bazıları geçersiz kılınır sahte gibi görünüyor. Eğer bu doğru ise, bu işlevsellik normal PHPUnit mock tarafından işlenir.

Bir PHPUnit_Framework_TestCase içinde, sizinle alay oluşturmak

$ = $ This-> getMock ('Class_To_Mock') alay;

Hangi tüm yöntemler bir şey ve geri dönüş yapmak, null bir alay örneğini oluşturur. Sadece yöntemlerden bazıları geçersiz kılmak istiyorsanız, getMock için ikinci parametre geçersiz kılmak için yöntemler bir dizidir.

$ = $ This-> getMock ('Class_To_Mock', array ('insert', 'update')) alay;

belirtilmesi onların dönüş değerleri için hazır kaldırıldı "insert" ve "Update" fonksiyonları ile Class_To_Mock bir alay örneğini oluşturur.

Bu bilgiler, phpunit docs içinde.

Ben PHPUnit test altında sistem için kısmi mocks destekler sanmıyorum. Eğer yöntemler izole etmeye çalışıyorsanız o zaman ben senin uygulama işleri eminim - Yaptığım bu da var.

Ancak, nedenleri bir çift için, bunu önlemek için deneyin.

Birincisi, bu çiftler çok sıkı sınıfının iç uygulama için test. Eğer gerçekten denilen bir yöntem doesLongRunningThing denirdi umrumda, ya da "LongRunningThing" bitti bu daha önemli musunuz?

Ben bu içine çalıştırdığınızda İkincisi, her zaman bana iki iş yapıyor bir sınıf var mı merak yapar. Bir extract class üstlenmeden sırayla olabilir. doesLongRunningThing(), hatta tek bir yöntemle kendi sınıf, olursa testi çok daha kolay olur.

Ben çözüm SUT (http://en.wikipedia.org/wiki/Dependency_injection) bağlıdır hizmetlerini enjekte etmek olduğuna inanıyorum. Bu, aynı zamanda, DoesLongRunningThing uygulanması daha test edilebilir hale getirir.

Arayüzler içine atlama olmadan, burada ben yapardım:

class DoesLongRunningThing {
    public function execute() {
        sleep(10);
        return "stuff";
    }
}

class StuffDoer {
    protected $doesLongRunningThing;

    public function setLongRunningThinger(DoesLongRunningThing $obj) {
        $this->doesLongRunningThing = $obj;
    }

    public function doStuff() {
        return $this->doesLongRunningThing->execute();
    }
}

Şimdi sahte kolay:

class StuffDoerTestCase extends PHPUnit_Framework_TestCase {
    public function testStuffDoer() {
        $dlrtMock = $this->getMock('DoesLongRunningThing');
        $dlrtMock->expects($this->any())->will($this->returnValue("test stuff"));

        $sd = new StuffDoer();
        $sd->setLongRunningThinger($dlrtMock);
        $result = $sd->doStuff();
        $this->assertEquals($result, "test stuff");
    }
}