2010-04-23 5 views
3

J'utilise normalement des méthodes getter et setter sur mes objets et je suis très bien avec les tester comme objets fantaisie dans SimpleTest en les manipulant avec le code comme:Est-il possible de définir des propriétés sur un objet Mock dans Simpletest

Mock::generate('MyObj'); 
$MockMyObj->setReturnValue('getPropName', 'value') 

Cependant, j'ai récemment commencé à utiliser des intercepteurs magiques (__set() __get()) et les propriétés d'accès comme ceci:

$MyObj->propName = 'blah'; 

Mais j'avoir du mal à faire un objet fantaisie ont une propriété particulière accessible en utilisant cette technique .

Y at-il une manière spéciale de définir des propriétés sur MockObjects?

J'ai essayé de faire:

$MockMyObj->propName = 'test Value'; 

mais cela ne semble pas fonctionner. Je ne sais pas si c'est mon sujet de test, Mock, Interceptors magique ou SimpleTest qui cause l'inaccessibilité de la propriété.

Donc, en résumé:

Je peut méthodes de la maquette sur mes objets fantaisie, mais je ne parviens pas à se moquant-up des propriétés de classe d'objets fantaisie. Est-il possible de définir des propriétés sur un objet Mock dans Simpletest?

Tout conseil est le bienvenu.

+0

(J'ai annulé la réponse partielle, car nous encourageons les réponses dans la case de réponse, pas dans les questions). – halfer

Répondre

3

En réponse à ma question ...

Oui il est possible de définir les propriétés des simulacres d'objets qui utilisent des intercepteurs magiques - il suffit de définir la valeur de retour de la méthode intercepteur comme vous le feriez avec toute autre méthode .

SimpleTest Exemple Mocking Intercepted Propriétés sur les objets moquée

pour cet objet

class MyObj 
    { 

    public function __set($name, $value) 
    { 
    $props[$name] = $value; 
    } 

    public function __get($name) 
    { 
    return $props[$name] = $value; 
    } 

    } 

un client (testé classe aggrégateur) peut accéder aux propriétés comme si

$MyObj->propName = 'blah'; 
echo $MyObj->propName; //prints blah 

et il peut se moquer comme si

Mock::generate('MyObj'); 
$MockMyObj = new MockMyObj(); 
$MockMyObj->setReturnValue('__get', 'test property value', array('propName')); 

//...later on... 
echo $MockMyObj->propName; //prints "test property value" 

P.S. Voici quelques docs sur simulacres: http://www.simpletest.org/en/mock_objects_documentation.html

P.P.S

Je ne fait essayer avant, mais mon expérimentation a été obscurci par une faute de frappe dans mon code.

+1

Vous n'avez pas besoin de créer un objet initial avec une méthode '__get'. Seulement ajouter '-> setReturnValue ('__ get', 1, array ('myAttribute'));' sur l'objet maquette fonctionne :) – Ifnot

+0

Merci @AnaelFavre. C'est intéressant à entendre. –