Plugin UnitTest: Wie kann man Config() Werte beeinflußen?

Hi Leute,

Ich versuche gerade endlich mal Unittests für eines meiner Plugins (altes Pluginsystem) zu schreiben, scheitere momentan aber daran die Config des Plugins zu beeinflußen um auch alle Codezweige abzudecken.

Die Tests an sich laufen so weit, die initiale config aus $ensureLoadedPlugins wird ohne Probleme eingelesen. Aber spätere Änderungen haben keinerlei Wirkung und in der getesten Methode kommt weiterhin der initiale Wert an. Die getestete bzw. zu testende Methode liegt in einer Klasse die per __construct() die Bootstrap bekommt und sich über diese die Config() holt um einen Wert zu lesen, die Bootstrap wiederum wird über Shopware()->Plugins()->Frontend()->pluginName() instanziert.

Ich vermute mal das meine Herangehensweise einfach falsch ist, aber wie geht es denn richtig?

Kannst Du ein minimales Plugin als Beispiel zur Verfügung stellen?

Dann schaue ich es mir gerne mal an!

Komme ich leider erst morgen abend dazu, habe mir heute vorgenommen nach zwei Tagen Frust mich heute statt phpstorm mal STEAM zu widmen

Aber auf das Angebot komme ich morgen gerne zurück! Wenn dir eine “nicht minimalisierte” Version auch reicht, schicke ich dir per PM aber auch gerne einen Link.

Im neuen Testsystem übergebe ich die Confi Werte per DI z. B. wie folgt:

    service('config').get('PLUGIN_NAME::CONFIG_NAME', DEFAULT_VALUE) 

Dann kann ich es natürlich leicht testen. Für das alte Plugin System: Du könntest Deinen Klassen Getter Methoden hinzufügen, die den Config Wert auslesen. In Deinem Test müsstest Du dann die Getter Methoden weg mocken. Nicht sehr schön, aber das trifft ja auf das alte Plugin System grundsätzlich zu.

1 „Gefällt mir“

@mcdope schrieb:

Aber auf das Angebot komme ich morgen gerne zurück! Wenn dir eine „nicht minimalisierte“ Version auch reicht, schicke ich dir per PM aber auch gerne einen Link.

 

Kannst Du gerne machen.  Werde aber erst Montag Abend dazu kommen mir das anzu schauen. :slight_smile:

1 „Gefällt mir“

So, habe gerade mal das “strip down” erstellt. Habe irgendwie erwartet dabei den Fehler schon zu finden, aber nein. Ist auch so reproduzierbar.

Hier das “strip down” Plugin: Dropbox - unittestbugfragezeichendemo.zip - Simplify your life

Und hier die Ausgabe die es bei mir erzeugt, mit Stand der verwendeten Shopware:

 

Allerdings ist es natürlich eh fragwürdig einfach die ganze Bootstrap zu injecten. Korrekter wäre wohl die eigentlich benötigten Sachen zu injecten, und so werde ich es wohl auch refactoren.

Dennoch würde mich interessieren warum das hier nicht geht, denn eigentlich hätte ich erwartet das es geht… ¯_(ツ)_/¯

 

Nachtrag: Habe es jetzt so abgeändert das die Config als Array injected wird. Zusätzlich die eine Methode die genutzt wurde dorthin verschoben wo sie auch wirklich genutzt wird. Jetzt funktioniert das auch mit den Tests. Falls jemand weiß warum es nicht wie im Demo-Plugin funktioniert wäre ich aber definitiv neugierig.