PHP - Simpletest - перечислите каждый вызов методам Mock Object

StackOverflow https://stackoverflow.com//questions/9699738

Вопрос

Моя проблема в том, что мне нужно перечислить каждый звонок в макет объекта, потому что мне нужно их проверить.Я не нашел ничего об этой функции в Simpleetest Documentation.: S

Может быть, есть еще один способ проверить мой код:

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

}
.

Это анализатор, ожидающий вложенного массива, из которого я собираюсь создать дерево объекта карты.Я вводю фактическое дерево с помощью Settree (Clean_Collection_tree_maptreeInterface $ 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);
}
.

Парсер использует только PUT (ARRAY $ PATHION, $ value) метод.Таким образом, список каждая под названием «Метод положения» покажет мне, что пошло не так в парсере.(Если у Simplemock не имеет этой функции, я могу создать свой собственный объект Mock, который нам реализует интерфейс. Я на нем.)

Это было полезно?

Решение

Проблема в дизайне класса Simplemock:

protected function addCall($method, $args) {

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

Они должны были создать класс регистратора для регистрации свойств вызова вместо установки свойства в Simplemock ... мы можем создать обходной путь, расширяя класс 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;
    }

}
.

и установите его как базовый макет класса:

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

После этого мы можем получить список ссылаться с $ mockobj-> getmockinvokes () .

EDIT : Мы не можем продлить AddCall, потому что в первой строке метода invoke имя метода преобразуется в нижний регистр, поэтому путем расширения AddCall, мы можем только регистрировать строчные буквы, а не толькокамера.(Я думаю, что в нижнем регистре преобразование - это ошибка ...)

Я создал тест на демонстрацию:

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

}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top