Pregunta

Mi problema es que necesito enumerar cada llamada a un objeto simulado, porque necesito verificarlos.No he encontrado nada sobre esta característica en la documentación más simple.: S

Tal vez haya otra forma de probar mi código:

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

}

Este es un analizador que espera una matriz anidada de la que tengo la intención de crear un árbol de objetos de mapa.Inyecto el árbol real con settree (Clean_collection_tree_maptreeinterface $ Tree) y la interfaz de árbol de mapa es:

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

El analizador utiliza solo el método put (array $ ruta, $ valor) .Así que enumerar todos los llamados métodos me mostrarán lo que salió mal en el analizador.(Si el Simplemock no tiene esta función, puedo crear mi propio objeto simulado que implementamos la interfaz. Estoy en ella.)

¿Fue útil?

Solución

El problema está en el diseño de la clase SIMPLEMOCK:

protected function addCall($method, $args) {

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

Deberían haber creado una clase de registrador para registrar propiedades de llamada en lugar de establecer una propiedad en el Simplemock ... Podemos crear una solución al extender la clase 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;
    }

}

y configúralo como Clase Mock Base:

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

Después de eso, podemos obtener la lista de invocaciones con el $ mockobj-> getmockinvokes () .

Editar : no podemos extender el AddCall, porque en la primera línea del método invocar el nombre del método se convierte en minúsculas, por lo que extendiendo el AddCall, solo podemos registrar el formato en minúsculas y noEl camello.(Creo que la conversión en minúscula es un error ...)

He creado una prueba de demostración:

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

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top