2013-06-25 8 views
5

Ich begann mit Silex zu arbeiten und es ist einfach toll. Das Problem tritt auf, wenn ich versuche, meinen Unterricht richtig zu testen. Konkret die Verschlüsse :( In den folgenden Zeilen erklären ich mein Problem zu sehen, ob jemand von euch weiß, wie es zu lösen. Bitte, den Schwerpunkt nicht auf die Syntax aber die Prüfaufgaben selbst.Testing in Silex (Mock-Verschlüsse) mit PHPUnit

Ich habe einen Anbieter wie dies:

<?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) {} 
} 

Dann brauche ich eine Instanz des foo_bar Element zu erhalten.

<?php 

namespace Foo; 

use Silex\Application; 

class Clazz { 
    protected $bar; 

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

Das funktioniert ganz gut die Sache ist, dass ich entwickle mit TDD (und PHPUnit) und es ist mir unmöglich, die Clazz-Klasse richtig zu testen.

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

Das Problem liegt hier in der "()" nach dem $ app [ 'foo_bar'] in der Clazz Klasse. Beim Versuch, den Test, den ich eine bekommen auszuführen: Fehler „PHP Fatal error Funktionsname eine Zeichenfolge in ... sein muss“. Ich verstehe, dass ich die Klasse nicht Unit-Test auf diese Weise testen kann, aber ich sehe nicht den richtigen Weg, um es zu tun.

Wie konnte ich diese Aussage testen (weil am Ende der einzige komplexe Aussage $ this-> bar = $ app 'foo_bar';)?

+0

Vielleicht ist die Github finden Sie einige Anregungen geben: https://github.com/fabpot/Silex/tree/master/tests/Silex/Tests – qrazi

+0

Ich habe bereits versucht, dass aber könnte ein gutes Beispiel nicht gefunden :( – ThisIsErico

Antwort

3

Ok, ich glaube, ich richtig diese Schließung zu testen geschafft! Der letzte Test sieht folgendermaßen aus:

Anstatt den Schein zurückzugeben, gebe ich eine Schließung zurück, die den Schein zurückgibt. Auf diese Weise bekomme ich den Fehler nicht, während ich immer noch mit dem eigentlichen Schein arbeite.

Kann mir jemand sagen, ob dies ein richtiger Ansatz ist?