2016-12-20 4 views
0

Es gibt die Möglichkeit, Methode und Rückgabewert abhängig von Methode Argument zu verspotten? Ich brauche das, um Container zu simulieren und Service zu bekommen. Ich versuche, dies zu tun durch:Mock-Methode des Objekts und Rückgabewert des Objekts hängen von der Methode ab param

$container = $this 
     ->getMockBuilder(Container::class) 
     ->getMock(); 

$container 
     ->expects($this->any()) 
     ->method('get') 
     ->with('logger') 
     ->willReturn($this->loggerMock)//this is logger object 
    ; 
$container->expects($this->any()) 
     ->method('get') 
     ->with('database') 
     ->will($this->returnValue(self::$pdo));//database object 

$this->dataProviderFactory = new DataProviderFactory($container); 

Und wenn ich nenne das: print_r ($ Container-> get ('Logger')); sollte Logger-Objekt haben.

Aber das funktioniert nicht. Ich habe Fehler unter:

Erwartung für Methodenname fehlgeschlagen ist gleich beim Aufruf null oder mehrere Male

Parameter 0 for invocation Symfony\Component\DependencyInjection\Container::get('logger', 1) does not match expected value. 
Failed asserting that two strings are equal. 
Expected :'database' 
Actual :'logger' 
+0

Dies ist in keinem Zusammenhang mit Ihrer Frage, aber sind Sie sicher, dass Sie Ihre Fabrik müssen auf den gesamten Behälter abhängig sein? Es könnte besser sein, nur die Dienste, die es benötigt, wie den Logger und die Datenbankverbindung, zu injizieren. Und es macht das Testen ein bisschen einfacher. – Cerad

+0

Im Moment kann ich dies nicht in der Weise tun, die Sie vorschlagen, weil aufgrund der Struktur der Anwendung, die ich entwickeln –

Antwort

1

Sie können dies tun, indem Sie eine Callback-Funktion auf das Argument der Methode zur Laufzeit übergeben handeln .

Versuchen Sie Folgendes:

$container = $this 
    ->getMockBuilder(Container::class) 
    ->getMock(); 

$container 
    ->expects($this->any()) 
    ->method('get') 
    ->will($this->returnCallback(function ($arg) { 
     $map = [ 
      'logger' => $this->loggerMock, 
      'database' => $this->returnValue(self::$pdo) 
     ]; 
     return $map[$arg]; 
    })) 
; 
+0

Vielen Dank! Das ist das, was ich benötige :) –

Verwandte Themen