2014-02-27 13 views
8

Ich habe eine Frage, als ich Unit-Test meine Anwendung war. Ich habe eine Methode, die eine Abhängigkeit erfordert, aber nur diese Methode braucht es, also dachte ich, sie nicht durch construct zu injizieren, sondern mit App :: make() der IoC-Container-Klasse zu initialisieren. Aber wie kann ich das testen?Wie man App :: make() auf UnitTesting Laravel 4 simuliert

Lasst uns ein kleines Beispiel sagen für verstehen, wie Sie Gerät diese Funktion beispiel Prüfung

class Example { 

    public function methodToTest() 
    { 
     $dependency = App::make('Dependency'); 
     return $dependency->method('toTest'); 
    } 

} 

-Test

public function test_MethodToTest() { 
    $dependency = m::mock('Dependency'); 
    $dependency->shouldReceive('method')->once()->with('toTest')->andReturn(true); 

    $class = new Example(); 
    $this->assertTrue($class->methodToTest('toTest')); // does not work 
} 

Antwort

17

Sie sind fast da. Erstelle einen anonymen Spott mit den Erwartungen, die du brauchst, und registriere diesen Spott dann als Instanz für Abhängigkeit und du solltest gut gehen.

, die ungefähr so ​​

public function test_MethodToTest() { 
    $dependency = m::mock(); 
    $dependency->shouldReceive('method')->once()->with('toTest')->andReturn(true); 
    App::instance('Dependancy', $dependancy); 

    $class = new Example(); 
    $this->assertTrue($class->methodToTest()); // should work 
} 
+0

Genau! Es funktioniert, Danke! :) – Fabrizio

+0

Es funktioniert, aber mit getMock() '$ Abhängigkeit-> getMock()' –

+0

Nein. Wenn Sie $ Abhängigkeit-> getMock() direkt verwenden, testen Sie nur, dass der Schein richtig eingerichtet wurde, nicht das Das methodToTest() der Example-Klasse wird wie erwartet aufgerufen. Wenn $ class-> methodToTest() nicht für Sie funktionierte, empfehle ich, die Art und Weise zu betrachten, wie Ihr Äquivalent der Example-Klasse eingerichtet wurde. – petercoles

0

aussehen würde ich es vorziehen würde die Abhängigkeit in Example Klassen Konstruktor zu injizieren.

class Example{ 
    /** @var Dependency */ 
    private $dependency; 

    public function __construct(Dependency $dependency){ 
     $this->dependency = $dependency; 
    } 

    public function methodToTest(){ 
     return $this->dependency->method('toTest'); 
    } 
} 

class Test{ 
    public function test_MethodToTest(){ 
     $mock = Mockery::mock(Dependency::class); 
     $mock->shouldReceive('method')->once()->with('toTest')->andReturn(true); 

     $class = new Example($mock); 
     $this->assertTrue($class->methodToTest()); 
    } 
} 

In Ihrem Controller, Bibliotheken können Sie dann IoC verwenden wie diese

$example = App::make(Example::class);