Question

Mon problème est que je dois énumérer chaque appel à un objet faux, car j'ai besoin de les vérifier.Je n'ai rien trouvé à propos de cette fonctionnalité dans la documentation SimpleTest.: S

Peut-être qu'il y a une autre façon de tester mon code:

class Clean_Collection_Tree_NestedArrayParser {

    protected $path = array();
    protected $depth = -1;

    /** @var Clean_Collection_Tree_MapTreeInterface */
    protected $tree;

    public function setBasePath(array $path) {
        $this->path = $path;
    }

    public function setTree(Clean_Collection_Tree_MapTreeInterface $tree) {
        $this->tree = $tree;
    }

    public function parse($subject) {
        $this->parseArray($subject);
    }

    public function parseArray(array $array) {
        ++$this->depth;
        foreach ($array as $key => $value) {
            $this->path[$this->depth] = $key;
            if (is_array($value)) {
                $this->tree->put($this->path, new Clean_Collection_Map_Map());
                $this->parseArray($value);
            } else
                $this->tree->put($this->path, $value);
        }
        if (!empty($array))
            array_pop($this->path);
        --$this->depth;
    }

}

Ceci est un analyseur qui attend un tableau imbriqué à partir de laquelle j'ai l'intention de créer un arborescence d'objets de carte.J'injecte l'arbre réel avec settree (Clean_Collection_tree_maptreeterface $ arbre $) et l'interface de la carte est:

interface Clean_Collection_Tree_MapTreeInterface extends Clean_Collection_CollectionInterface {

    public function putAll(array $array);

    public function put(array $path, $value);

    public function get(array $path);

    public function getAll(array $pathes);

    public function removeAll(array $pathes);

    public function remove(array $path);

    public function contains(array $path);
}

L'analyseur utilise uniquement la Met (Array $ PATH, VALEUR DE VALEUR) .Donc, la liste de chaque méthode de mise appelée me montrera ce qui s'est mal passé dans l'analyseur.(Si le SimpleMock n'a pas cette fonctionnalité, je peux créer mon propre objet simulateur que nous implémentons l'interface. Je suis dessus.)

Était-ce utile?

La solution

Le problème est dans la conception de la classe SimpleMock:

protected function addCall($method, $args) {

    if (! isset($this->call_counts[$method])) {
        $this->call_counts[$method] = 0;
    }
    $this->call_counts[$method]++;
}

Ils auraient dû créer une classe d'enregistrement pour la journalisation des propriétés d'appel au lieu de définir une propriété dans la SimpleMock ... Nous pouvons créer une solution de contournement en prolongeant la classe SimpleMock:

class LoggedMock extends SimpleMock {

    protected $invokes = array();

    public function &invoke($method, $args) {
        $this->invokes[] = array($method, $args);
        return parent::invoke($method, $args);
    }

    public function getMockInvokes() {
        return $this->invokes;
    }

}

et la définir comme classe de base de la base:

    require_once __DIR__.'simpletest/autorun.php';
    SimpleTest::setMockBaseClass('LoggedMock');

Après cela, nous pouvons obtenir la liste d'invoque avec la $ mockobj-> getmockinvokes () .

edit : Nous ne pouvons pas étendre le addCall, car dans la première ligne de la méthode d'invoque, le nom de la méthode est converti en minuscule, donc en prolongeant le format complémentaire, nous ne pouvons enregistrer que le format minuscule et nonle camelcase.(Je pense que la conversion en minuscule est une erreur ...)

J'ai créé un test de démonstration:

interface Nike {

    public function justDoIt();
}

class NikeUser {

    protected $nike;

    public function setNike(Nike $nike) {
        $this->nike = $nike;
    }

    public function doIt() {
        $this->nike->justDoIt();
    }

}

Mock::generate('Nike', 'MockNike');

class NikeUserTest extends UnitTestCase {

    public function testDoItButWeDontWantJustDoIt() {
        $mockNike = new MockNike();

        $nikeUser = new NikeUser();
        $nikeUser->setNike($mockNike);

        $expectedInvokes = array();

        $nikeUser->doIt();
        $expectedInvokes[] = array('justDoIt', array());
        $this->assertEqual($expectedInvokes, $mockNike->getMockInvokes());
    }

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top