PHP: тестируем нетестируемое – echo

В данной заметке я хочу рассказать, как тестировать конструкции echo и ей подобные в PHP.

Допустим у нас есть такой код:


class World {
public function printHello() {
echo 'hello world';
}

public function printHello2() {
?>
hello world
<?php
}

//...

}


«Как же нам протестировать методы Hello и Hello2?» – вчера ночью этот вопрос загнал меня в тупик. Немного поразмыслив, я все-таки выкрутился из ситуации – для первого случая достаточно отрефакторить код таким образом, чтобы на вход конструкции echo подавался результат функции, вычисляющий требуемое значение:


class World {
/** @returns string */
public function getGreeting(){
return 'hello world';
}

public function printHello(){
echo $this->getGreeting();
}

//...

}


Такой код уже поддается тестированию:


/** @test */
public function getGreetingReturnsHelloWorld () {
$world = new World;

self::assertEquals('hello world', $world->getGreeting());
}


Но как же быть во втором случае? Во втором случае нам поможет тестирование непрямого вывода . Перед вызовом тестовой системы добавим вызов функции ob_start() которая включает буферизированный вывод, а после вызова системы проверим содержимое буфера с помощью вызова функции ob_get_flush():


/** @test */
public function hello2InderectTesting () {
$world = new World;

ob_start();
$world-> printHello2 ();
$actual = ob_get_flush();

self::assertEquals('hello world', $actual);
}
comments powered by Disqus