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