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.
Vielleicht kann Ihnen das helfen: https://stackoverflow.com/a/44948780/1652031 – TiMESPLiNTER
@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. –