atoum / atoum-documentation

Documentation of atoum, a php unit test framework
http://docs.atoum.org
Other
10 stars 41 forks source link

PHP native function mock #336

Closed franck-paul closed 1 year ago

franck-paul commented 1 year ago

Bonjour,

J'ai un peu de mal à comprendre comment fonctionne le "mock" des fonctions natives de PHP et la doc est très… comment dire… succinte pour un newbie comme moi dans ce domaine.

En particulier je n'ai aucune idée de l'utilité de la ligne ->if($this->function->file_exists = true) ou encore de celle-ci ->if($this->function->file_exists = false ) ; en particulier le = true ou = false ?

J'avoue avoir tenté de fouiller dans le code d'Atoum mais vu l'absence (absolue) de commentaires dans le code j'ai vite abandonné.

En m'inspirant de la doc j'ai codé ceci, qui à l'air de fonctionner pour bouchonner la fonction native PHP mail :

        $this
            ->assert('mail')
            ->given($this->newTestedInstance())
                ->if($this->function->mail = true)
                ->then
                    ->boolean($this->testedInstance->sendMail('contact@example.com', 'Subject', 'Content'))
                        ->isTrue()
                    ->function('mail')
                        ->wasCalled()
                        ->once()

            ->assert('mail failed')
            ->given($this->newTestedInstance())
                ->if($this->function->mail = false)
                ->then
                    ->exception(function () { $this->testedInstance->sendMail('contact', 'Subject', 'Content'); })
        ;

Et je suppose parce que la méthode en cours de test (sendMail) renvoie true ou lève une exception en cas d'erreur. Par contre dans l'exemple suivant la fonction native fsockopen n'est pas bouchonnée du tout :

        $header_from = 'From: contact@dotclear.org';

        $this
            ->assert('mail')
            ->given($this->newTestedInstance())
                ->if($this->function->fsockopen = true)
                ->then
                    ->variable($this->testedInstance->mail('contact@example.com', 'Subject', 'Content', $header_from))
                        ->isNotFalse()
                    ->function('fsockopen')
                        ->wasCalled()
                        ->once()

            ->assert('mail no from')
            ->given($this->newTestedInstance())
                ->if($this->function->fsockopen = false)
                ->then
                    ->exception(function () { $this->testedInstance->mail('contact@example.com', 'Subject', 'Content'); })
        ;

Sachant que la méthode testée (mail) fait appel à la fonction native fsockopen de PHP. J'avoue que la phrase « atoum permet de très facilement simuler le comportement des fonctions natives de PHP. » au début de la doc me laisse pour le moins perplexe.

Par ailleurs j'ai cherché un forum de discussion pour poser la question à la communauté, mais je n'ai rien trouvé ; quant au canal IRC, il est désespérément vide (sur freenode en tout cas). Il existe autre chose ?

franck-paul commented 1 year ago

Bon je crois que j'ai compris : ->function->php_native_fn doit être défini avec ce qui va être retourné (simple valeur, expression, voire closure)

Désolé pour le bruit !

PS : Ça mériterait une petite phrase dans la doc pour expliquer ça, je pense.