2013-06-25 27 views
5

ile test etme Silex ile çalışmaya başladım ve sadece harika. Sorun, sınıflarımın uygun bir birim testini denerken ortaya çıkıyor. Aşağıdaki satırlarda :(Somut kapanışları Aranızdaki bunu çözmek için nasıl biliyorsa benim sorunum görmek açıklar. , sözdizimi ama test sorunu kendisi odaklanmak etmeyin.Silex'te (sahte kapaklar) PHPUnit

Ben bir sağlayıcı gibi var Bu:

<?php 

namespace Foo\Provider; 

use Silex\Application; 
use Silex\ServiceProviderInterface; 

use Foo\Bar; 

class BarProvider implements ServiceProviderInterface { 

    public function register(Application $app) { 
     $app[ 'foo_bar' ] = $app->protect(function() use ($app) { 
      return new Bar($app); 
     }); 
    } 

    public function boot(Application $app) {} 
} 

Sonra foo_bar elemanının bir örneğini almak gerekir.

<?php 

namespace Foo; 

use Silex\Application; 

class Clazz { 
    protected $bar; 

    public function __construct(Application $app) { 
     $this->bar = $app[ 'foo_bar' ](); 
    } 
} 

Bu sadece iyi çalışır şey gelişmekte olmam TDD (ve PHPUnit) kullanarak ve Clazz sınıfını uygun bir şekilde test etmem imkansız.

<?php 

namespace Foo\Test; 

use PHPUnit_Framework_TestCase; 

use Silex\Application; 

use Foo\Bar; 
use Foo\Clazz; 

class ClazzTest extends PHPUnit_Framework_TestCase { 

    public function testConstruct() { 
     $mock_bar = $this->getMock('Foo\Bar'); 

     $mock_app = $this->getMock('Silex\Application'); 
     $mock_app 
      ->expects($this->once()) 
      ->method('offsetGet') 
      ->with('foo_bar') 
      ->will($this->returnValue($mock_bar)); 

     new Class($mock_app); 
    } 
} 

sorun burada Clazz sınıfında "()" $ app sonra [ 'foo_bar'] bulunur. Testi yürütmeye çalışırken "PHP Önemli hatası: İşlev adı bir dizede olmalıdır ..." hatası alıyorum. Anladığım kadarıyla sınıfları bu şekilde test edemiyorum ama bunu yapmanın uygun yolunu göremiyorum.

Bu ifadeyi nasıl test edebilirim (çünkü sonuçta yalnızca karmaşık ifade $ -> bar = $ app 'foo_bar';)?

+0

Belki de github size biraz ilham verecektir: https://github.com/fabpot/Silex/tree/master/tests/Silex/Tests – qrazi

+0

Zaten bunu denedim ama iyi bir örnek bulamadım :( – ThisIsErico

cevap

3

Tamam, sanırım bu kapanışı doğru şekilde test etmeyi başardım! Son test şuna benzer:

<?php 

namespace Foo\Test; 

use PHPUnit_Framework_TestCase; 

use Silex\Application; 

use Foo\Bar; 
use Foo\Clazz; 

class ClazzTest extends PHPUnit_Framework_TestCase { 

    public function testConstruct() { 
     $mock_bar = $this->getMock('Foo\Bar'); 

     $mock_app = $this->getMock('Silex\Application'); 
     $mock_app 
      ->expects($this->once()) 
      ->method('offsetGet') 
      ->with('foo_bar') 
      ->will($this->returnValue(function() use($mock_bar) { return $mock_bar; })); 

     new Class($mock_app); 
    } 
} 

yerine mock döndürmek, ben alay döndüren bir kapatma döner. Bu şekilde, hala gerçek alayla çalışırken hatayı alamıyorum.

Bu doğru bir yaklaşım olup olmadığını kimse söyleyebilir mi?