PHPUnit und Validatoren [Gelöst]


  • 0 x
    17. 04. 2012, 11:59

    Hallo zusammen,

    ich starte gerade mich in die Entwicklung von Extension auf Basis von Extbase und Fluid einzuarbeiten.
    Die ersten Plugins laufen auch auf dieser Basis. :-)

    Jetzt wollte ich aber noch einen Schritt weiter gehen und TDD mit PHPUnit verwenden.
    Das Plugin läuft, die Testes soweit auch.

    [b]Jetzt meine Frage:[/b]

    Im Domain Model kann ich ja mit @validate festlegen wie ein Wert auszusehen hat, damit er valide ist.
    Leider verstehe ich nicht, wie ich das im Test berücksichtige.

    Hier mal ein ganz simples Beispiel:

    Code aus dem Domain Model. Der übergebene Integerwert darf nicht NULL sein und soll zwischen 1 und 5 liegen:

    1. /**
    2. * Amount of the product in stock
    3. *
    4. * @var integer
    5. * @validate NotEmpty, NumberRange(startRange = 1, endRange = 5)
    6. */
    7. protected $amount;

    Entsprechende Getter und Setter sind vorhanden:
    1. /**
    2. * Returns the amount
    3. *
    4. * @return integer $amount
    5. */
    6. public function getAmount() {
    7. return $this->amount;
    8. }
    9.  
    10. /**
    11. * Sets the amount
    12. *
    13. * @param integer $amount
    14. * @return void
    15. */
    16. public function setAmount($amount) {
    17. $this->amount = $amount;
    18. }

    Jetzt dachte ich: "Hey, wenn ich überprüfen will, ob tatsächlich ein Fehler auftritt, rufe ich die Funktion in meiner Testklasse einfach auf und übergebe als Integerwert 12. Dann müsste der Test ja fehlschlagen"
    Hier der Code aus meiner Testklasse:

    1. class Tx_Ajaxtest_Domain_Model_ProductsTest extends Tx_Extbase_Tests_Unit_BaseTestCase {
    2. /**
    3. * @var Tx_Ajaxtest_Domain_Model_Products
    4. */
    5. protected $fixture;
    6.  
    7. public function setUp() {
    8. $this->fixture = new Tx_Ajaxtest_Domain_Model_Products();
    9. }
    10.  
    11. public function tearDown() {
    12. unset($this->fixture);
    13. }
    14.  
    15. /**
    16. * @test
    17. */
    18. public function getAmountReturnsInitialValueForInteger() {
    19. $this->fixture->setAmount();
    20. $this->assertSame(
    21. NULL,
    22. $this->fixture->getAmount()
    23. );
    24. }
    25.  
    26. /**
    27. * @test
    28. */
    29. public function setAuthorForIntegerSetsAuthor() {
    30. $this->fixture->setAuthor(12);
    31.  
    32. $this->assertSame(
    33. 12,
    34. $this->fixture->getAuthor()
    35. );
    36. }
    37. }

    Leider ist dem nicht so. Wo ist hier mein Verständnisproblem? Was muss ich tun, wenn ich dies Prüfen will?

    Wäre dankbar wenn mir jemand hier weiterhelfen könnte!

    Besten Dank!

  • jvelletti jvelletti
    Padawan
    0 x
    53 Beiträge
    0 Hilfreiche Beiträge
    20. 04. 2012, 10:34 - Lösung

    ich hab mir dein Problem zwar nicht genau angeschaut, aber vielleicht hilft dir der Link bei einem einfacherem Einstieg in PHP Unit und Extbase ..
    [url=
    http://www.slideshare.net/oliverklee/testdriven-development-for-typo3-12541044]
    http://www.slideshare.net/oliverklee/testdriven-development-for-typo3-12541044[/url]

    ist der Vortrag von der den TYPO3 Deveoper Days 2012 zu phpunit testing vom Oliver Klee ..
    grüße aus München


  • 1

  • 0 x
    17. 04. 2012, 13:44

    Ok,
    ich glaube nun zuwissen, was das Problem ist.

    Der Validator ist in der proxy class, welche jedoch nicht mit compiliert wird, wenn eben solch ein Test aufgerufen wird. Hierzu ist ein Functional Test notwendig!

    Gut, dann schaue ich mal, wie man einen functional test schreibt...

  • jvelletti jvelletti
    Padawan
    0 x
    53 Beiträge
    0 Hilfreiche Beiträge
    20. 04. 2012, 10:34

    ich hab mir dein Problem zwar nicht genau angeschaut, aber vielleicht hilft dir der Link bei einem einfacherem Einstieg in PHP Unit und Extbase ..
    [url=
    http://www.slideshare.net/oliverklee/testdriven-development-for-typo3-12541044]
    http://www.slideshare.net/oliverklee/testdriven-development-for-typo3-12541044[/url]

    ist der Vortrag von der den TYPO3 Deveoper Days 2012 zu phpunit testing vom Oliver Klee ..
    grüße aus München


  • 0 x
    20. 04. 2012, 11:35

    Danke für den Link.
    Leider hilft er mir nicht wirklich weiter.
    Ich fange gerade erst mit Extbase und Fluid an, bin daher noch nicht so fit darin.
    Jedoch wollte ich gerne versuchen, gleich auch mit TDD Erfahrungen zu sammeln.

    Kannst du mir ggf. ein gutes Buch hierzu empfehlen?

    Toll wäre, wenn ich schon mal wüsste was ich tun muss, damit ich einen Test machen kann der validiert ob die Validierung funktioniert.

    In dem Beispiel unten, habe ich einfach mit dem Extension Builder ein Object "Product" erstellt, drei Eigenschaften (Name, Description, Amount) gegeben und gesagt das die Eigenschaft Amount zwischen 1 und 5 sein soll.

    -> PHPUnit Test auf die Setter Methode mit dem Wert 10 für Amount (hier sollte ein Fehler kommen, da ja nur bis 5 erlaubt ist)

    Das funktioniert aber so leider nicht. #paralyzed#

    Jetzt wäre es spannend zu wissen wie es denn funktioniert.... :-/

  • BFSven BFSven
    R2-D2
    0 x
    106 Beiträge
    2 Hilfreiche Beiträge
    23. 04. 2012, 10:19

    Hallo,

    Ein Objekt wird nur validiert, wenn Du die isValid-Methode des Validators aufrufst. Da Du hier den Standard-Validator benutzt, kannst Du davon ausgehen, dass der Validator auch funktioniert ;)

    Wenn Du eigene Validatoren schreibst und diese testen willst, erzeugst du im setUp ein Fixture von Deinem Validator

    1. $this->fixture = new Tx_MyExt_Domain_Validator_ContactFormValidator();

    und rufst ihn dann im Test mit Deinem Objekt als Parameter auf:

    1. $test = $this->fixture->isValid($this->contactForm);
    2. $this->assertEquals(FALSE, $test);

    Ein Objekt kann und muss ja auch nicht-valide Daten halten können. Wenn Du zb ein Formular ausfüllst und auf Absenden klickst, dann validiert er das Formular, schlägt fehl und zeigt Dir das fehlgeschlagene Property trotzdem im Formular wieder an (was er nicht könnte, wenn er den Value nicht annehmen dürfte).

    Als Einstiegsbuch habe ich "TYPO3-Extension mit Extbase & Fluid" von J. Rau & S. Kurfürst benutzt, weiterführend selbst viel programmieren und in diesem Forum aktiv sein.

    Gruß, Sven


  • 0 x
    23. 04. 2012, 13:37

    Hallo Sven,

    das löst schön einmal viele Fragezeichen auf! :)

    Ich werde das dann mal testen.

    Vielen Dank für deine Hilfe!

  • 1