Klasse im Unit Test überschreiben.

Hallo zusammen,

Da ich kein „PHP native speaker“ bin, komme ich bei meine Unit test gerade an meine Grenzen.
Es dreht sich um das Sonos Modul.

Folgendes Problem am Beispiel von SNS_PLAY( ):

Bei dieser Funktion wird eine einfach Funktion per SOAP call aufgerufen.
Um es einfacher zu haben habe ich alle SOAP Calls in die Klasse „SonosAccess“ ausgelagert. Diese liegt in einer eigenen PHP Datei (Sonos/sonosAccess.php at master · tkugelberg/Sonos · GitHub), die im Modul per

require_once __DIR__ . '/../libs/sonosAccess.php';

eingebunden ist.

Die Play Funktion macht jetzt im Prinzip ein


$sonos = new SonosAccess($ip);
$sonos->Play( );

wobei die IP vorher aus den Properties der Instanz ausgelesen wird.

Mein Test funktionert jetzt bis zu dem Zeitpunkt, bis der SOAP call abgesetzt wird. Also konkret


$client = new SoapClient(null, [
      'location'           => 'http://' . $this->address . ':1400' . $path,
      'uri'                => $uri,
      'trace'              => true
]);

return $client->__soapCall($action, $parameter);

Eigentlich würde ich jetzt ja gerne den SoapClient wegdoubeln. Schaffe es aber nicht.
Und so etwas wie mockery ist mir da etwas zu komplex.

Zur Zeit sieht mein Test so aus:


    public function testPlay()
    {

        $playerID = IPS_CreateInstance('{52F6586D-A1C7-AAC6-309B-E12A70F6EEF6}');

        $playerInterface = IPS\InstanceManager::getInstanceInterface($playerID);

        IPS_SetProperty($playerID, 'IPAddress', '192.168.1.2');
        IPS_SetProperty($playerID, 'DisableHiding', true);
        IPS_SetProperty($playerID, 'SleeptimerControl', true);
        IPS_SetProperty($playerID, 'PlayModeControl', true);
        IPS_SetProperty($playerID, 'DetailedInformation', true);
        IPS_ApplyChanges($playerID);

        SNS_Play($playerID);
    }

Und ich bekomme einen Timeout beim SOAP call.

Alternativ könnte ich mir auch vorstellen, die komplette SonosAccess zu überschreiben, aber auch hier sehe ich keine Möglichkeit.

Das einzige was ich hinbekommen würde wäre ein interner Parameter „unittest“, den ich dann in die SonosAccess durchreiche und mich dann anders verhalte.
Das fänd ich aber kacke.

Hat irgendwer ein Beispiel, wie ich das lösen könnte?

Danke,
Thorsten

Ähnliches haben wir beispielsweise in den Tests der Anwesenheitssimulation gemacht. Da haben wir im Trait TimeTest (AnwesenheitsSimulation/timetest.php at master · symcon/AnwesenheitsSimulation · GitHub) eine verschiedene Funktion für getTime(), je nachdem ob es sich um Testbetrieb oder regulären Betrieb handelt. Die Testfunktionalität ist so auch nicht im Normalbetrieb erreichbar, du musst also nicht mit Zusatzparametern rumbasteln. Lediglich durch eine Systemvariable in der phpunit.xml wird dies unterschieden.

Hallo,

vielen Dank, das war genau der Schubser in die Richtige Richtung.

Danke,
Thorsten