Вы не можете перехватить и fwrite(STDERR);
из тестового примера с помощью phpunit.В этом отношении вы даже не можете перехватить fwrite(STDOUT);
, даже с буферизацией вывода.
Так как я предполагаю, что вы действительно не хотите вводить STDERR
в ваш "errorOutputWriter
" (как это нене имеет никакого смысла для класса писать что-то еще) это один из очень немногих случаев, когда я бы предложил такой небольшой взлом:
<?php
class errorStreamWriterTest extends PHPUnit_Framework_TestCase {
public function setUp() {
$this->writer = new errorStreamWriter();
$streamProp = new ReflectionProperty($this->writer, 'errorStream');
$this->stream = fopen('php://memory', 'rw');
$streamProp->setAccessible(true);
$streamProp->setValue($this->writer, $this->stream);
}
public function testLog() {
$this->writer->log("myMessage");
fseek($this->stream, 0);
$this->assertSame(
"Error: myMessage",
stream_get_contents($this->stream)
);
}
}
/* Original writer*/
class errorStreamWriter {
public function log($message) {
fwrite(STDERR, "Error: $message");
}
}
// New writer:
class errorStreamWriter {
protected $errorStream = STDERR;
public function log($message) {
fwrite($this->errorStream, "Error: $message");
}
}
Вынимает поток stderrи замените его потоком в памяти и прочитайте его обратно в тестовом примере, чтобы увидеть, был ли записан правильный вывод.
Обычно я наверняка скажу: «Ввести путь к файлу в классе»но с STDERR
это не имеет никакого смысла для меня, так что это было бы моим решением.
phpunit stderrTest.php
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 5.00Mb
OK (1 test, 1 assertion)
Обновление
Подумав, я скажу, чтоможет не сработать что-то вроде errorSteamWriter
как класса.
Просто наличие StreamWriter
и построение его с помощью new StreamWriter(STDERR);
приведут к хорошему тестируемому классу, который можно использовать много раз.цели в приложении без жесткого кодирования какой-то«это то, куда идут ошибки» в классе, который сам по себе и добавляет гибкости.
Просто хотел добавить это как вариант, чтобы избежать «уродливых» тестовых опций:)