Der PHPUnit-Test schlägt fehl, wenn die Objekteigenschaft im catch-Block gesetzt wird

8

Ich teste setSubject Methode, die das Objekt (leeres Subjekt) setzt, wenn es fehlt. Zend_Mail löst eine Exception aus, wenn versucht wird, auf eine nicht deklarierte Eigenschaft zuzugreifen (z. B. E-Mail-Betreff fehlt, besser einige Ausnahmen werfen). Weitere Informationen: Ссылка Das ist es, was ich brauche, um es erfolgreich testen zu können:

Klasse

%Vor%

Test

%Vor%

Sie können jedoch sehen, dass der catch-Block leer ist, wenn ich diesen Code ausprobiere ...

%Vor%

Test schlägt mit der Nachricht fehl:

  

Es gab 1 Fehler:

     

1) Email_ParseTest :: testNoSubject   InvalidArgumentException: Betreff ist erforderlich

Es beklagt sich, dass $ this- & gt; Betreff nicht gesetzt ist (oder ähnlich).

Weitere Informationen:

  • PHP 5.4.8
  • Zend Framework 1.9.5
  • PHPUnit 3.6.12
  • subject ist als leere Zeichenfolge definiert ( "" )

Ich habe die zweite Methode "von Hand" getestet und es funktioniert wie erwartet (Betreff wird innerhalb des catch-Blocks gesetzt). Ich habe nicht viel Erfahrung mit PHPUnit, dies könnte E_PEBKAC leicht sein.

    
Dejan Marjanovic 03.12.2012, 20:08
quelle

2 Antworten

3

Wenn ich Ihre Frage nicht missverstanden habe, versuchen Sie eine geschützte Methode zu testen ... Sie können das nicht auf diese Weise tun. Geschützte und private Methoden sollen getestet werden, indem die öffentlichen Methoden getestet werden, die sie verwenden.

Wenn Sie PHP 5.3.2+ mit PHPUnit verwenden, können Sie Ihre privaten und geschützten Methoden direkt testen, indem Sie vor der Ausführung Ihrer Tests Reflektionen verwenden, um sie öffentlich zu machen. Wie Sie jedoch bereits erwähnt haben, Stellen Sie sich vor, öffentliche Methoden zu testen.

Aber wenn Sie die Reflexion verwenden möchten, hier ist ein generisches Beispiel:

%Vor%     
jsteinmann 22.12.2012 16:07
quelle
1

Sieht so aus, als ob du die falsche Ausnahme fällst: Zend_Mail scheint ein InvalidArgumentException zu werfen, während du ein Zend_Mail_Exception fängst.

Probieren Sie den folgenden Code:

%Vor%

Bearbeiten

Wenn Sie Ihre Frage erneut lesen, würde ich sagen, dass Zend_Mail_Exception niemals geworfen wird. Wenn Sie try / catch aus dem ersten Codeblock entfernen, wette ich, dass es auch funktioniert:

%Vor%

Zeile 396 bezieht sich auf eine nicht vorhandene Kopfzeile, aber Es sieht so aus, als ob es nicht ausgelöst wird, selbst wenn $this->subject leer ist (die Ausnahmeklasse und die Nachricht stimmen nicht mit dem Testergebnis überein). Ich vermute, dass dieser Header zuvor in Zend oder anderswo auf einen leeren Wert gesetzt wurde.

Das würde erklären, warum im zweiten Fall $this->subject niemals gesetzt wird (der Code catch wird niemals ausgeführt). Die InvalidArgumentException wird wahrscheinlich von der parseEmail -Klasse ausgelöst, die erkennt, dass subject nicht gesetzt ist.

Der zweite Block prüft jedoch unbedingt ! $this->subject und setzt ihn entsprechend. Also ist der Test bestanden.

Zusammenfassend:

  • Zend_Mail_Exception wird niemals geworfen
  • InvalidArgumentException wird in parseEmail geworfen
Benjamin 04.12.2012 11:22
quelle