2011-12-05 15 views
6

Yaptığım bir projeye bir test çerçevesini dahil etmek istiyorum ve beğendiğim Enhance PHP'a rastlıyorum ama "php'yi geliştirdiğinden" bu konuyla ilgili bilgileri çevrimiçi bulmakta zorluk çekiyorum. yaygın olarak kullanılan bir ifade."PHP'yi Geliştirin" ile Başlayın

Bu çerçeveyle çalışan herhangi biri, yararlı bir kılavuza yönlendirebileceğimi düşündü mü? İnanılmaz derecede daha iyi olduğunu düşündüğünüz bir birim test çerçevesiyle çalıştınız mı?

Şimdiden teşekkürler. Gotzofter cevaben

, bu sınıf test edilecek geçerli: ExampleClass benim yapıcı az

<?php 
include_once('EnhanceTestFramework.php'); 

class ExampleClass 
{ 
    private $OtherClass; 

    function __construct($mock = null) 
    { 
     if ($mock == null) 
      $this->OtherClass = new OtherExampleClass(); 
     else 
      $this->OtherClass = $mock; 
    } 

    public function doSomething() 
    { 
     return $this->OtherClass->getSomething(1, 'Arg2'); 
    } 
} 

class OtherExampleClass 
{ 
    public function getSomething() 
    { 
     return "Something"; 
    } 
} 

class ExampleClassTests extends \Enhance\TestFixture 
{ 
    public function setUp() 
    { 
    } 

    public function tearDown() 
    { 
    } 

    public function verifyWithAMock() 
    { 
     $mock = \Enhance\MockFactory::createMock('OtherExampleClass'); 
     $mock->addExpectation(
      \Enhance\Expect::method('getSomething') 
       ->with(1, 'Arg2') 
       ->returns('Something') 
       ->times(1) 
      ); 
     $target = new ExampleClass($mock); 
     $result = $target->doSomething(); 
     \Enhance\Assert::areIdentical("Something", $result); 

     $mock->verifyExpectations(); 
    } 
} 

\Enhance\Core::runTests(); 

bakış.

Geliştiriciden-php'nin site örneği $ Örnek nesnesini ($ mock) çağırarak $ alay nesnesini enjekte ettiğinden, bir örnek parametresi olarak $ alayını işlemek için ExampleClass yapıcımı değiştirmeye zorlanıyorum.

Bunu, çerçeve ile birim testine tabi tutmak istediğim tüm sınıflar için halletmem gerekiyor mu?

Teşekkürler.

+1

[enhance-php.com] (http://www.enhance-php.com) bir [Hızlı Başlangıç ​​Kılavuzu] (http://www.enhance-php.com/Content/Quick-Start-Guide içeriyor /) ve [tüm önemli özellikleri iyi belgelere] var gibi de görünüyor (http://www.enhance-php.com/Content/Documentation/). Tam olarak bunun ötesinde ne arıyorsun? –

+9

[PHPUnit] (http://phpunit.de) fiili birim test çerçevedir. TBH Hiç Enhance'u hiç duymadım (bunu ucuza çekmeyin, sadece dürüst olun). –

+0

@Colin - Belki sadece Mock kullanımını anlamıyorum. Bu kılavuzdaki talimatları izleyerek beklediğim sonuçları alamıyorum. Orijinal yazıya – baiano

cevap

3

Bu:

function __construct() 
{ 
    $this->OtherClass = new OtherExampleClass; 
} 

olmalı:

function __construct($otherClass) 
{ 
    $this->OtherClass = $otherClass; 
} 

Sizin sahte senin testinde bu noktada enjekte asla:

$target = new ExampleClass($mock); 
+0

orijinal yazıya bir kod ekleyeceğim. Cevabın demek istediğin şey bu mu? – baiano

+1

Tam olarak varsayılan bir nesne oluşturmanıza sahip bir kurucu yapmazdım. Sadece standart ** Bağımlılık Enjeksiyon ** ile kalmayın Ayrıca, 'bir şey' yönteminin testinizde parametreleri vardır, ancak uygulanmadı. – Gutzofter

+0

Ben bunu anlamaya çalışıyorum. Standart Bağımlılık Enjeksiyonu Nedir? PHP'nin öğretici geliştirmek üzerine örnekler tüm resmi gösterme ve yukarıdaki kod İşe testleri almak mümkün olmuştur tek yoludur. – baiano

1

tek şey olursa olsun ne öneriyoruz Kullandığınız sınama çerçevesi, beklenen sınıfa veya arabirime karşı yazım şeklidir.

<?php 
class ExampleClass 
{ 
    private $OtherClass; // OtherClass instance 

    public function __construct(OtherClass $OtherClass=null) 
    { 
     // ... 
    } 
} 

hiçbir di uzmanı değilim, ama bir örnek, belirli bir bağımlılığı sağlanmazsa her sınıf görüşme yeni icar içinde sorun görmüyorum. Tabii ki bağımlılıkları yapılandırmak için setter metotlarını kullandığınız yaklaşıma da girebilirsiniz.

<?php 
class class ExampleClass 
{ 
    private $OtherClass; // OtherClass instance 

    public function setOtherClass(OtherClass $OtherClass) 
    { 
    $this->OtherClass = $OtherClass; 
    } 
} 

örnek kodda ExampleClass bile ExampleDependencyClassTests den doSomething yöntemi bulmadığı topal, ama eğer doğru anlamak o benziyor PHP zorlayarak değil geliştirin Belirli bir bağımlılık enjeksiyon tarzı almalısınız. Ancak istiyorum Sen test sınıf yazabilir, bu nedenle yukarıda belirtilen ayarlayıcı yöntem yaklaşımını aldı örneğin, bunu probly anlamda uygun hale getirmek için yapacağı Tabii

<?php 
class ExampleDependencyClassTests extends \Enhance\TestFixture 
{ 
    public function verifyWithAMock() 
    { 
     $mock = \Enhance\MockFactory::createMock('ExampleDependencyClass'); 
     $mock->addExpectation(
      \Enhance\Expect::method('getSomething') 
      ->with(1, 'Arg2') 
      ->returns('Something') 
      ->times(1) 
     ); 
     $target = new ExampleClass(); 
     $target->setExampleDependencyClass($mock); 
     $result = $target->doSomething(); 
     $mock->verifyExpectations(); 
    } 
} 

ila Örnek sahte kod değiştirebilir ExampleClass için düzeltmeler!

<?php 
class ExampleClass 
{ 
    private $ExampleDependencyClass; 

    public function addTwoNumbers($a, $b) 
    { 
     return $a + $b; 
    } 

    public function setExampleDependencyClass(
     ExampleDependencyClass $ExampleDependecyClass 
    ) { 
     $this->ExampleDependecyClass = $ExampleDependecyClass; 
    } 

    public function doSomething($someArg) 
    { 
     return 'Something'; 
    } 
} 

Ben PHPUnit biraz çalıştık ve dürüstçe orada Mocks ile aynı sorunlarla karşı karşıya gerekecek. Benim 2 cent, Mocks mümkünse olmadan testleri modellemek için deneyin;)

İlgili konular