oder wie immer sich das nennt, geht das irgendwie?
Ich will eine Klasse mit statische Methoden testen die von nichts erbt, intern aber einen \Environment::get(..) beinhaltet. Das würde ich gern mit testen.
Druckbare Version
oder wie immer sich das nennt, geht das irgendwie?
Ich will eine Klasse mit statische Methoden testen die von nichts erbt, intern aber einen \Environment::get(..) beinhaltet. Das würde ich gern mit testen.
Alle Sachen die ich bisher gefunden habe, basieren auf "staticExpects" und das gibt es leider ab PHPUnit 4.1 nicht mehr.
Sebastian Bergmann meint dazu: Die vorgeschlagene Alternative besteht darin, statische Methoden nicht verwenden. :(
Meine schräge Idee im Kopf will ich nicht umsetzen, ich suche daher weiter.
Das einfachste wäre ein Refactoring, wäre aber noch ein API Break. Aber was solls, einer mehr, ist eh ne neue Major Release die ich in der Mache habe, da ist das ja erlaubt.
TL;DR: Static methods are not testable! :)
Du solltest keine statischen Methoden mit side effects haben, da kannst du keine DI betreiben und auch nicht sauber mocken.
In Contao 4 haben wir hierzu nun Adapter geschaffen, welche die Contao 3 statischen Dinge wegabstrahieren und somit wieder testbar machen.
Was hast du denn fyr einen konkreten Usecase?
Ich will in einer meiner Methoden den UserAgent untersuchen (Bot:ja/nein)
Dazu lasse ich mir den UserAgent vom Framework geben, falls dieser beim Aufruf nicht mit übergeben wird.
Mal der Anfang:
Die Frontend Modul Klasse ruft diese bisher so aufPHP-Code:
class CheckBotAgentSimple
{
public static function checkAgent($UserAgent=false)
{
// Check if user agent present
if ($UserAgent === false)
{
if (\Environment::get('httpUserAgent'))
{
$UserAgent = trim(\Environment::get('httpUserAgent'));
}
else
{
return false; // No user agent, no search.
}
}
.....hier suche ich dann....
}
}
Ich könnte natürlich den Aufruf so machen:PHP-Code:
$return = CheckBotAgentSimple::checkAgent();
und die Methode entsprechend kürzen.PHP-Code:
$return = CheckBotAgentSimple::checkAgent( \Environment::get('httpUserAgent') );
Nachtrag: Hab das jetzt so abgeändert. So kann ich dann per PHPUnit Test Agent Strings übergeben wie bisher auch.
Das ist auf jeden Fall besser/richtiger. :)
Gibt es eigentlich irgendwo ein bisschen Info-Material zum Testen von Contao-Extensions? Ich würde das gerne machen, tue mir aber noch mit dem richtigen Setup im Zusammenhang mit dem Contao-Framework schwer.
Kommt drauf an was du machen willst. Eigene Erweiterungen testen oder fremde?
Und funktionale Tests (ohne Contao Framework) oder Integrationstest (mit Contao Framework)
Leider lässt sich das nicht recht trennen in allen Fällen.
Ich bin selber grad dabei die Erweiterungen von mir wenn ich was größeres ändern muss gleich ein wenig umzuschreiben, damit die überhaupt funktional testbar werden.
Testen dann natürlich mit PHPUnit, da muss man sich natürlich einarbeiten.
Ich sammle dabei einige Tipps: https://contao.ninja/tipps-und-trick...91;2][]=18
Nebenbei baue ich mir eine Testumgebung in einer VM die vieles lokal automatisieren soll (über Jenkins). Nur halt lokal und nicht auf Portalen die es dafür gibt.
Siehe auch den Vortrag von xtra auf der Konferenz https://www.cyberspectrum.de/talks.h...woe_ck2015.pdf
Wenn ich ein wenig Zeit finde kommt demnächst meine Erkenntnis darüber raus :-)
http://docs.contao.ninja/de/c3tdd.html
Hi Bugbuster,
danke für deine Tipps. Deine Tippssammlung verfolge ich bereits. Mir geht es um das Testen eigener Erweiterungen, sowohl funktional als auch was die Integration in Contao angeht. Ich frage mich, wie ich z.B. eine Klasse teste, die von \Module oder \Frontend erbt?
Derzeit teste ich solche Klassen mit PHPUnit gar nicht.
Bei meinen neuen Erweiterungen bestehen z.B. das Frontend Modul nur aus wenigen Zeilen, die ganze Logik lagere ich aus in mehrere passende Klassen die ich so schreibe, das ich diese testen kann.
Problematisch sind Klassen die Datenbank Abfragen haben. Hier wenns sein muss teste ich die Klasse indem ich die Erweiterung in eine lokale lauffähige Contao Version installiere und darin den Test mache. Dazu muss man dann natürlich die Initialisierung durchlaufen durch einlesen der initialize.php.
Es gibt einige Ansätze die Datenbank Klasse zu mocken, über class_alias zum Beispiel. Aber das ist mir derzeit noch zu komplex.
Ich bin schon froh, wenn ich meine Logiken testen kann. Dazu muss ich natürlich einiges Simulieren, Objekte über new stdClass nachbilden und als Parameter der Methode übergeben.
BugBuster: evtl was fyr dich https://github.com/MetaModels/phpunit-contao-database
Ist weit entfernt von perfekt, aber sollte dir helfen.