2013-05-02 6 views
1

J'ai quelques tests dans ma suite de tests en cours d'exécution dans le test Zend_TestPHPUnit Mock Object remplaçant classe réel

On crée une maquette de Foo_Bar_Baz via MockBuilder de PHPUnit que cette classe sa dépendance. Maintenant, dans le test pour Foo_BAR_baz (le changement dans le cas est exprès et est nécessaire en raison de l'auto-chargement), je ne reçois pas la classe, mais plutôt une instance du simulacre, qui évidemment ne fonctionne pas. Si vous effectuez un var_dump sur l'objet, vous obtiendrez class Foo_Bar_Baz#27115(0) { } et il semblera donc créer une instance du simulacre. Fixer le cas de dans le simulacre met les choses au travail comme prévu.

Je n'ai jamais vu ce comportement dans des objets moqueurs avant. Pour une raison quelconque, la classe mockée est en cours de chargement en PHP, de sorte que lorsque le prochain test essaie d'instancier l'objet réel, il instancie le faux à la place. Pourquoi cela arriverait-il?

+0

"Je ne reçois pas la classe mais plutôt une instance du simulacre" - Pouvez-vous clarifier cela? Votre code (pas le test) instancie un objet et vous vous attendez à ce qu'il soit une instance de quoi exactement et vous obtenez quoi exactement? –

+0

Après avoir lu quelques fois peut-être cela vous aidera: Si vous créez une classe fictive et que vous la nommez après une vraie classe concrète, vous ne pourrez jamais obtenir la classe concrète dans le registre interne. –

+0

Je suis capable d'obtenir la classe concrète avec les noms de classe la même chose. C'est seulement quand ils sont différents comme dans mon exemple que ça ne marche pas. Et normalement cela fonctionne en PHPUnit sauf dans ce cas très étrange. – Schleis

Répondre

0

Les noms de classes dans PHP ne sont pas sensibles à la casse, mais les noms de fichiers sur un serveur * nix sont.

Je soupçonne que le changement de cas provoque un changement de comportement à cause d'un mécanisme de chargement automatique; PHP ne chargerait que l'un des fichiers Foo_Bar_Baz.php et Foo_BAR_Baz.php.

Dans votre cas, si vous avez déjà défini une classe Foo_BAR_Baz (en tant que simulacre) alors PHP utilisera la même définition pour Foo_Bar_Baz, ignorant ainsi votre définition de classe réelle.

Questions connexes