Ankündigung

Einklappen
Keine Ankündigung bisher.

Mocken von Yaml Parser

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mocken von Yaml Parser

    Hallo,
    ich habe eine Funktion geschrieben, die ich mit PHPUnit testen will.

    PHP-Code:
    use Symfony\Component\Yaml\Yaml;
    .
    .
    .
    public function 
    validateYaml()
    {
        
    $yaml Yaml::parse(file_get_contents('resources/config.yml'));

        
    // If yaml doesn't have any entries, terminate
        
    if ($yaml == null ||!(array_key_exists("components"$yaml)) || !(array_key_exists("alertmanager"$yaml))) {
            
    $logger->error("config.yaml has no entrys or is incorrect. Check config.yaml. Nothing has changed on Cachet");
            die(
    "config.yaml has no entrys or is incorrect. Check config.yaml. Nothing has changed on Cachet");
        }
        return 
    $yaml;

    Ich will in meinem Unit-Test verschiedene Varianten von yaml-Dateien testen, um alle Fälle abzudecken.

    Wie kann ich in meinem Programm (oder im Test) deutlich machen, dass er sich die Datei eben nicht von dem Pfad holen soll, sondern, dass ich meine Varianten der Yaml-Datei im Unit-Test mocke und so jegliche Testfälle durchlaufen lasse?

    VG


  • #2
    Idealerweise, indem die YAML-Datei als Dependency an die Klasse übergeben wird. Ansonsten kannst du noch versuchen die Funktion file_get_contents()(z.B. mit PHPMock) bzw. das Dateisystem (=> sh. Doku) zu mocken.

    Kommentar


    • #3
      Du hast ein Typisches Design Problem. Da musst du wohl die Methode so umschreiben, das der Pfad konfiguriert werden kann.

      Oder du schaust dir mal den Inhalt der Yaml:arse Methode an, dort steht:
      PHP-Code:
          public static function parse(string $inputint $flags 0)
          {
              
      $yaml = new Parser();
              return 
      $yaml->parse($input$flags);
          } 
      Also könntest du es richtig machen, Injecte die Klasse im Konstruktur und rufe dann $this->yaml->parse auf. Diese Klasse kannst du dann nämlich Mocken.

      Kommentar


      • #4
        Bevor du ans Testen gehst würde ich das gesamte Design deiner Methode überarbeiten. Dazu einige Tipps:
        1. Ein fixer Dateipfad in einer Methode geht gar nicht. Übergebe den Dateipfad dem Konstruktor deiner Klasse wie schon empfohlen oder wenigstens als Parameter der Methode.
        2. Ein die() in einer Methode finde ich ebenso unschön. Werfe eine Exception oder gebe true/false als Returnwert zurück und entscheide außerhalb der Methode was du unternehmen möchtest wenn deine Config fehlerhaft ist.
        3. Grobe Fehler wie $logger->error solltest du vorher beseitigen. $logger existiert in der Methode nicht.
        4. Wenn du eine externe Loggerklasse an dieser Stelle nutzen möchtest, dann übergebe besser eine Logger-Instanz dem Konstruktor deiner Klasse
        5. Spendiere für identische Meldungen eine Variable. Bei einer Änderung brauchst du dann nur eine Stelle anfassen.
        PHP-Klassen auf github

        Kommentar


        • #5
          Danke für die Tipps! Werde ich am Montag gleich mal probieren

          Kommentar

          Lädt...
          X