phpunit как тестировать вызов метода внутри тестируемого метода. все в одном классе.

denisOg

Новичок
есть код:
PHP:
class SomeClass {

public function parseAction(){
    if ($this->beginParse()) {
        $this->parser();
    }
    $this->endParse();
}

public function beginParse() {
    //some action
}

public function endParse() {
    //some action
}

public function parser() {
    //some very long action
}
}
как протестировать метод parseAction на то, что он последовательно вызывает функции и при этом достаточно что бы функции не реализовывали родное поведение, а просто запускались(или возвращали тру)
 

AmdY

Пью пиво
Команда форума
мокаешь класс и методы кроме тестируемого parseAction.
 

denisOg

Новичок
мокаешь класс и методы кроме тестируемого parseAction.
пробовал. пишет нет такого метода
Код:
public function testParseAction()
    {

        $handler =  $this->getMock('Handler', array('beginParse', 'parser','endParse'));
        //$handler =  $this->getMock('Handler', array('beginParse', 'parser','endParse','parseAction'));

        $handler->expects($this->once())
            ->method('beginParse')
            ->will($this->returnValue(true));

      $handler->expects($this->once())
            ->method('parser')
            ->will($this->returnValue(true));

      $handler->expects($this->once())
            ->method('endParse')
            ->will($this->returnValue(true));

      $handler->parseAction();
    }
Код:
PHP Fatal error:  Call to undefined method Mock_Handler_bea34c1f::parseAction() in
 

keltanas

marty cats
Если выходной сигнал соответствует поданному входному сигналу, значит метод работает правильно. А как именно метод достигает результата - уже его личное дело.
 

Вурдалак

Продвинутый новичок
Не нужно так тестировать, ты рассматриваешь класс как черный ящик, ты не можешь знать вызывается ли внутри одного метода другой того же класса. Во всяком случае, тебе это не нужно знать.

Тут вопрос почему beginParse, endParse и parser (?!) являются public.
 

denisOg

Новичок
Не нужно так тестировать, ты рассматриваешь класс как черный ящик, ты не можешь знать вызывается ли внутри одного метода другой того же класса. Во всяком случае, тебе это не нужно знать.

Тут вопрос почему beginParse, endParse и parser (?!) являются public.
логично. спасибо. эти методы были protected пока я не стал "эксперементировать" как их протестить. сделаю обратно защищенными.
 

hell0w0rd

Продвинутый новичок
Вурдалак, ну в случае с симфони, можно создать сервер и вынести terminate за пределы ответа клиенту, на пример.
Не знаю как в случае ТС, код не видел - может тоже юзкейс найдется
 

Lionishy

Новичок
В книге Страуструпа такие методы называются "стратегиями". Их суть: "гарантировать безопасность" вызова неидемпотентных операций в алгебре. Встречается достаточно часто. В обычной жизни мы оперируем "стратегиями" постоянно.

Очень хорошо подобные ситуации описаны в книгах Саттера по безопасному C++.
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
Да это местный теоретик, который не написал ни одной строчки кода.
 
Сверху