2017-06-07 2 views
7

Ich habe eine Reihe von Tests für Controller, die auf APIs von Drittanbietern angewiesen sind, die in der Testumgebung mokiert werden müssen. Wir überschreiben den Client-Crawler für Funktionstests und kopieren die Abhängigkeiten, mit denen wir testen müssen. Der Schlüssel hier ist, dass sich die Mocks bei jedem Test ändern.Überschreiben von Symfony 3.3 Container-Diensten in Controller-Tests

In Symfony 3.2 das hat gut funktioniert, aber in Symfony 3.3 Ich habe eine Reihe von deprecation Warnungen aufgrund der Art und Weise die Dienste jetzt injiziert werden:

Ein Beispiel Controller Testfall:

class MyControllerTest extends WebTestCase 
{ 
    private static $kernelModifier = null; 

    public function setKernelModifier(\Closure $kernelModifier) 
    { 
     self::$kernelModifier = $kernelModifier; 
     $this->ensureKernelShutdown(); 
    } 

    protected static function createClient(array $options = [], array $server = []) 
    { 
     static::bootKernel($options); 

     if ($kernelModifier = self::$kernelModifier) { 
      $kernelModifier->__invoke(); 
      self::$kernelModifier = null; 
     }; 

     $client = static::$kernel->getContainer()->get('test.client'); 
     $client->setServerParameters($server); 

     return $client; 
    } 

    protected function getPropertyClient() 
    { 
     $mockService = (new PropertyMock())->getPropertyMock(); 
     $this->setKernelModifier(function() use ($mockService) { 
      static::$kernel->getContainer()->set('app.property_service', $mockService); 
     }); 
     return static::createClient(); 
    } 

    protected function getPropertyFailureClient() 
    { 
     $mockService = (new PropertyMock())->getPropertyFailureMock(); 
     $this->setKernelModifier(function() use ($mockService) { 
      static::$kernel->getContainer()->set('app.property_service', $mockService); 
     }); 
     return static::createClient(); 
    } 
} 

Die eigentliche Test:

public function testInvalidPropertyRequest() 
{ 
    $client = $this->getPropertyClient(); 
    $client->request(
     'POST', 
     '/webhook/property', 
     [], 
     [], 
     [], 
     '' 
    ); 
    $this->assertEquals(400, $client->getResponse()->getStatusCode()); 
} 

Der deprecation Fehler:

Setting the "app.property_service" pre-defined service is deprecated since Symfony 3.3 and won't be supported anymore in Symfony 4.0: 3x

Ich habe die Release-Dokumentation 3.3 gelesen, BC bricht und veraltet und kann nicht herausfinden, wie ich Container-Dienste durch Mocks ersetzen würde, nachdem sie konfiguriert wurden.

Jede Hilfe wird geschätzt.

+0

Vielleicht kann Ihnen das helfen: https://stackoverflow.com/a/44948780/1652031 – TiMESPLiNTER

+0

@TiMESPLiNTER Danke dafür. Wir haben es schließlich gelöst, indem wir unsere Tests so umgestaltet haben, dass sie den Container nicht mehr modifizieren mussten. –

Antwort

2

Ich bin auch mit diesem Problem konfrontiert und es gibt keinen Hinweis innerhalb der Container-Klasse, wie diese Missachtung behandelt wird.

// Für alle Interessierten gibt es eine current issue open auf github - aber keine echte Lösung außer viel mehr Bootstrapping-Code für Ihre Komponententests oder Umzug, um die Controller isoliert zu testen. Ich würde empfehlen, alle Controller als Dienste mit festen/definierten Abhängigkeiten und ohne direkte DIC-Nutzung definiert zu haben.

+1

Sie haben zugegeben, dass sie ein bisschen zu weit gingen [in dieser PR] (https://github.com/symfony/symfony/pull/24418), also denke ich, dass es sicher ist, sich darauf zu verlassen. –

Verwandte Themen