2008-10-04 4 views
4

Je rencontre des problèmes lorsque je tente de mocker des objets avec les méthodes __get et __set (en utilisant simpletest).Mock testing et la méthode magique __get de PHP

Écrire des réponses fictives pour __get ne sent pas bon - les tests semblent trop étroitement liés à la mise en œuvre. Toutes les recommandations pour les tests, ou devrais-je juste éviter les méthodes magiques complètement?

+0

Pouvez-vous donner un exemple d'où vous rencontrez des problèmes? En ce qui concerne __get et __set, ils ont un domaine d'utilisation relativement petit qui n'ajoute pas de complexité inutile à un système. – gradbot

+0

J'utilisais un système comme celui proposé par penfold - mais mettre beaucoup de retours fictifs pour __get et __set avec des paramètres différents semblait mettre trop d'implémentation dans les tests – Ken

Répondre

3

J'ai eu le même problème et a trouvé la solution dans les cas de test SimpleTest:

De mock_objects_test.php:

class ClassWithSpecialMethods { 
    function __get($name) { } 
    function __set($name, $value) { } 
    function __isset($name) { } 
    function __unset($name) { } 
    function __call($method, $arguments) { } 
    function __toString() { } 
} 
Mock::generate('ClassWithSpecialMethods'); 

... snip ...

function testReturnFromSpecialAccessor() { 
    $mock = new MockClassWithSpecialMethods(); 
    $mock->setReturnValue('__get', '1st Return', array('first')); 
    $mock->setReturnValue('__get', '2nd Return', array('second')); 
    $this->assertEqual($mock->first, '1st Return'); 
    $this->assertEqual($mock->second, '2nd Return'); 
} 

function testcanExpectTheSettingOfValue() { 
    $mock = new MockClassWithSpecialMethods(); 
    $mock->expectOnce('__set', array('a', 'A')); 
    $mock->a = 'A'; 
} 

A peu maladroit, mais ça marche. D'un autre côté, je pense que vous feriez mieux de les éviter ... le grand système d'entreprise sur lequel je travaille les utilise énormément et c'est un cauchemar de comprendre/visualiser/déboguer/faire n'importe quoi!