Domanda

Il mio problema è che ho bisogno di elencare ogni chiamata a un oggetto finto, perché ho bisogno di controllarli.Non ho trovato nulla di questa funzione nella documentazione semplificata.: S

Forse c'è un altro modo per testare il mio codice:

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;
    }

}
.

Questo è un parser in attesa di un array nidificato da cui intendo creare un albero di oggetti mappa.Iniettile l'albero reale con Settree (Clean_Collection_tree_MaptreeInterface $ Tree) e l'interfaccia della mappa Tree è:

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);
}
.

Il parser utilizza solo il metodo Put (Array $, $ Value) .Così l'elenco di ogni Metodo di Filato Messo mi mostrerà ciò che è andato storto nel parser.(Se il SimpleMock non ha questa funzione, posso creare il mio obiettivo finto che attua l'implementazione dell'interfaccia. Sono su.)

È stato utile?

Soluzione

Il problema è nel design della classe SimpleMock:

protected function addCall($method, $args) {

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

Dovrebbero aver creato una classe logger per la registrazione delle proprietà della chiamata invece di impostare una proprietà nel simplemock ... possiamo creare una soluzione alternativa estendendo 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;
    }

}
.

e impostalo come classe Mock Base:

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

Dopo di che possiamo ottenere l'elenco invocato con il $ Mockobj-> GetMockInVokes () .

Modifica : Non possiamo estendere il rivestimento AddCall, poiché nella prima riga del metodo di invocazione il nome del metodo viene convertito in minuscolo, quindi estendendo il pregiudizio AddCall, possiamo solo registrare il formato minuscolo, e nonil camelse.(Penso che la conversione minuscola sia un errore ...)

Ho creato un test per la dimostrazione:

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());
    }

}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top