Ergebnis 1 bis 10 von 10

Thema: PHPUnit \Environment::get mocken/stubben

  1. #1
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard PHPUnit \Environment::get mocken/stubben

    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.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  2. #2
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard

    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.
    Geändert von BugBuster (20.07.2015 um 22:26 Uhr)
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  3. #3
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    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?
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  4. #4
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard

    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:
    PHP-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....
        }

    Die Frontend Modul Klasse ruft diese bisher so auf
    PHP-Code:
    $return CheckBotAgentSimple::checkAgent(); 
    Ich könnte natürlich den Aufruf so machen:
    PHP-Code:
    $return CheckBotAgentSimple::checkAgent( \Environment::get('httpUserAgent') ); 
    und die Methode entsprechend kürzen.

    Nachtrag: Hab das jetzt so abgeändert. So kann ich dann per PHPUnit Test Agent Strings übergeben wie bisher auch.
    Geändert von BugBuster (21.07.2015 um 00:10 Uhr)
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  5. #5
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Das ist auf jeden Fall besser/richtiger.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  6. #6
    Contao-Nutzer
    Registriert seit
    07.12.2009.
    Beiträge
    151

    Standard

    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.

  7. #7
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard

    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
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  8. #8
    Contao-Nutzer
    Registriert seit
    07.12.2009.
    Beiträge
    151

    Standard

    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?

  9. #9
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard

    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.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  10. #10
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    BugBuster: evtl was fyr dich https://github.com/MetaModels/phpunit-contao-database

    Ist weit entfernt von perfekt, aber sollte dir helfen.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •