Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<?php
class A {
/**
* Inline test example
* @assert (2,2) == 4
*/
private function _add($a,$b) {
return $a + $b;
}
}
$refl = new ReflectionClass('A');
$comment = $refl->getMethod('_add')->getDocComment();
echo $comment;
$m = $refl->getMethod('_add');
$m->setAccessible(true);
$m->invoke(new A);
Я считаю, что нужно тестировать поведение (интерфейс), а не реализацию, которая завтра может поменяться.
В том-то и причина, что по моим убеждениям «код-то дожен быть протестирован» неприменимо к приватным методам.
class myClass {
private function _sin($arg) { ... } // Почему бы не протестировать???
}
Приватность определяется не доступом к сорсам, а программным доступом к членам.
важно, что известные вызовы приводят к известным результатам.
У наследника доступа нет, но есть своя реализация и приватные методы, ему нет дела до приватных методов своего родителя
Завтра синус менеджеры заменят на косинус и в чем смысл теста?)
Приватные методы они на то и приватные, что в любой момент могут быть удалены, переписаны, дополнены, перемещены, раздроблены на более мелкие части. Если проект развивается здоровым путем, то это для него нормальная практика.
Надо, через тесты на публичные методы конкретных реализаций класса
public function ($arg) {
if () {
$arg = $this->_sin($arg);
$arg = $this->_cos($arg);
} elseif () {
$arg = $this->_cos($arg);
$arg = $this->_sin($arg);
} elseif () {
$arg = $this->_sin($arg);
$arg = $this->_tan($arg);
} elseif () {
$arg = $this->_cos($arg);
$arg = $this->_tan($arg);
}
}
Inline-тесты могут быть написаны даже для закрытых методов класса
Простота и скорость добавления тестов: что и говорить, иногда хочется написать тест, но когда вспомнишь, что для этого придется создавать всю иерархию папок для этого класса (напр. App_Module_Class), потом создавать файл и класс теста, писать один и тот же занудный код проверки, потом искать, где же этот PHPUnit находится и как его корректно запускать, — руки опускаются. Да и не жалко это сделать, если тест сложный и важный, а вот когда простой...
function getAsserts($comment) {
$asserts = array();
$lines = preg_split("#\n|\r#", $comment);
foreach ($lines as $line) {
$line = trim($line, "\r\n/* \t");
if (substr($line, 0, 7) == '@assert') {
$assert = trim(substr($line, 7));
if ($assert) $asserts[] = $assert;
}
}
return $asserts;
}
function getAsserts($comment) {
$asserts = array();
if( preg_match("/<assert>[\s\S]+?<\/assert>/", $line $tmpAasserts) )
{
$asserts[] = $tmpAasserts;
}
return $asserts;
}
Inline-тесты для PHP