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

  • Автор темы Автор темы denisOg
  • Дата начала Дата начала

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 на то, что он последовательно вызывает функции и при этом достаточно что бы функции не реализовывали родное поведение, а просто запускались(или возвращали тру)
 
мокаешь класс и методы кроме тестируемого parseAction.
 
мокаешь класс и методы кроме тестируемого 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
 
Если выходной сигнал соответствует поданному входному сигналу, значит метод работает правильно. А как именно метод достигает результата - уже его личное дело.
 
Не нужно так тестировать, ты рассматриваешь класс как черный ящик, ты не можешь знать вызывается ли внутри одного метода другой того же класса. Во всяком случае, тебе это не нужно знать.

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

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

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

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