Я только начал использовать PHPUnit для некоторого тестирования, и у меня возникают проблемы с обнаружением вывода.
$ this-> hasOutput () возвращает false, даже если я отображаю данные. Что я делаю неправильно? Любая помощь будет оценена!
class DatabaseTest extends PHPUnit_Framework_TestCase
{
public function testOutput() {
SampleDB::echoOutput();
$result = $this->hasOutput() ? "true" : 'false';
echo $result;
}
. . .
Реализация:
class SampleDB {
public static function echoOutput(){
echo "hello world!";
}
Запуск тестов:
phpunit DatabaseTest
PHPUnit 4.2.6 by Sebastian Bergmann.
.hello world!false.
Time: 55 ms, Memory: 1.75Mb
OK (2 tests, 0 assertions)
Вот источник для hasOutput
из моей версии PHPUnit (3.7.34, так что ваша может отличаться; если это так, мои выводы ниже могут быть неприменимы к вашему конкретному сценарию):
/**
* @return boolean
* @since Method available since Release 3.6.0
*/
public function hasOutput()
{
if (strlen($this->output) === 0) {
return FALSE;
}
if ($this->outputExpectedString !== NULL ||
$this->outputExpectedRegex !== NULL ||
$this->hasPerformedExpectationsOnOutput) {
return FALSE;
}
return TRUE;
}
output
переменная-член в тестовом примере заполняется только после выполнения теста (включая tearDown
) завершен, поэтому он всегда будет пустым во время выполнения теста и, следовательно, hasOutput
всегда будет возвращать false.
Я не уверен, что предполагаемое использование hasOutput
потому что я не могу найти его в документации по PHPUnit. На основании некоторого опровержения похоже, что оно используется, когда строгий режим включен, чтобы пожаловаться, если тест завершен и имеет вывод, который явно не ожидался.
Если вам нужно сделать что-то условно в своем тесте, основываясь на том, есть ли какие-либо результаты теста, вы должны быть в состоянии использовать getActualOutput()
(опять же, это 3.7.x версия функции; возможно, она изменилась в 4), которая вернет текущую буферизованную выходную строку.
Вы также можете использовать такие утверждения, как expectOutputString()
,
например
public function testOutput() {
SampleDB::echoOutput();
$result = ($this->getActualOutput() != '') ? "true" : 'false';
$this->expectOutputString('hello world!');
echo $result;
}
В этом случае утверждение не будет выполнено, потому что фактический результат теста 'helloworld!true'
Других решений пока нет …