phpunit tests für Modul mit SelectFile - Idee IPS_GetStatus schläft fehl

Guten Tag zusammen,

ich habe ein Modul mit folgenden Details:


class KNXer extends IPSModule
{
    public function Create()
    {
        parent::Create();

        $this->RegisterPropertyString('EtsXmlFile', '');
    }


    public function ApplyChanges()
    {
        $rawData = base64_decode($this->ReadPropertyString('EtsXmlFile'));

        if (@simplexml_load_string($rawData)) {
            $data = simplexml_load_string($rawData);
            $name = $data->GroupRange[13]->GroupRange[0]->GroupAddress[0]['Name'];
            $this->SendDebug('KNXer', (string) $name, 0);
        } else {
            $this->SetStatus(201);
        }

        parent::ApplyChanges();
    }
}

In der form.json ist entsprechend eine Statusmeldung für den Fehler, aber ich denke das ist jetzt irrelevant.

In meinen Tests würde ich gerne den Status abfragen wenn ich richtiges oder falsches XML in das Modul lade. Dies sieht bisher so aus:


    public function testParseXml()
    {
        $KNXerModulID = IPS_CreateInstance($this->KNXerID);
        $file = file_get_contents(__DIR__ . '/fixtures/ga_test.xml', true);

        IPS_SetProperty($KNXerModulID, 'EtsXmlFile', $file);
        IPS_ApplyChanges($KNXerModulID);

        IPS_GetStatus($KNXerModulID); //schläft fehl da nicht vorhanden

        $this->assertEquals('true', 'true'); // just to calm down phpunit for now
    }

So, IPS_GetStatus ist nicht vorhanden, jetzt stellt sich die Frage ob das nur an den Stubs liegt oder ob das generell nicht geht. Die Stubs schnell zu fixen habe ich versucht, ist aber doch etwas zu viel für mich, mit der geringen Erfahrung in PHP und IPS.
Oder ist das generell nicht sinnvoll und es gibt einen bessern Weg das zu testen?

Also ich möchte die Validierung der hochgeladenen Datei testen, nur um das Ziel nochmal klar zu machen :slight_smile:

Danke für alle Hinweise.

elmcrest

https://www.symcon.de/service/dokumentation/befehlsreferenz/instanzenverwaltung/ips-getinstance/
Michael

Alles klar, danke, damit konnte ich es lösen. Und zwar wie nachfolgend:


    public function testParseXml()
    {
        $KNXerModulID = IPS_CreateInstance($this->KNXerID);

        $file = file_get_contents(__DIR__ . '/fixtures/ga_test.txt', true);

        IPS_SetProperty($KNXerModulID, 'EtsXmlFile', $file);
        IPS_ApplyChanges($KNXerModulID);
        $KNXerInstance = IPS_GetInstance($KNXerModulID);

        $this->assertEquals(201, $KNXerInstance['InstanceStatus']);
    }

Verbesserungsvorschläge werden gerne angenommen :slight_smile:

Zur Erläuterung des Codes … Es wird das Modul IPS_CreateInstance erstmal instanziiert, das Objekt also erstellt.
Dann werfe ich mit IPS_SetProperty meine vorher geöffnete Datei in die Property namens „EtsXmlFile“ wie in module.php angelegt.
Anschließend wird die ApplyChanges aufgerufen von extern, daher mit dem Prefix IPS_
Final wird die Instance nochmal frisch aus dem Ram gezogen um sie in der Variable $KNXerInstance zu speichern um damit widerrum den Vergleich zu machen mit assertEquals.

Ich erkläre das auch für mich selbst, also falls da etwas falsch ist, bitte berichtigen :slight_smile:

Ok, da ist scheinbar doch noch etwas falsch. Ich werden das hier updaten sobald ich es gelöst habe.

Also das ganze scheint etwas komplizierter zu sein als gedacht, wäre für jede weitere Hilfe dankbar :slight_smile:

Was funktioniert denn nicht? Von der Testmethode her sieht das passend aus, ich kenne aber das Modul nicht.

So, nachdem das größte ein mir unbekanntes Problem war, dass sich (für mich) nur durch einen Windows Neustart lösen lässt, konnte ich weiter machen. Irgendwie geht die print_r und echo Ausgabe verloren und ich bekomm nichts mehr mit, warum habe ich keine Ahnung.

Jedenfalls mit print_r und echo ging es wieder weiter und es ergab sich, dass man auch wenn man die Tests ausführt (natürlich) die Datei nach dem öffnen base64 encoden muss um das Browser-Verhalten zu simulieren.

Hiermit geht der Test wie erwartet durch und nutzt auch das Modul-Code:


    public function testParseWrongXml()
    {
        $KNXerModulID = IPS_CreateInstance($this->KNXerID);

        $filestring = base64_encode(file_get_contents(__DIR__ . '/fixtures/ga_test_ets4.xml', true));

        IPS_SetProperty($KNXerModulID, 'EtsXmlFile', $filestring);
        IPS_ApplyChanges($KNXerModulID);

        $KNXerInstance = IPS_GetInstance($KNXerModulID);
        $this->assertEquals(202, $KNXerInstance['InstanceStatus']);
    }