как на самом деле работают объявления php (ticks)?
Вопрос
я создал класс обработки сигналов, используя pcntl_signal, который теперь я хочу использовать для sigalrm
проблема, с которой я сталкиваюсь, заключается в том, что мой тест phpunit для тестирования signalclass работает (где я использую только тики объявления в signalclass), но тестовый класс для тестирования класса alarm, который, в свою очередь, с помощью signalclass не работает если я добавлю declare(ticks = 1) в мои тесты alarmtests, это также сработает
я думал, объявлять галочки нужно только в коде обработки сигнала, который в моем случае находится в signalclass?но, насколько я вижу, это также необходимо для кода, который вызывает код обработки сигнала он даже не работает в моем alarmclass, я должен поместить его в свой класс alarmtest!?
несмотря на использование strace, сигнал доставляется независимо от тиков
итак, кто-нибудь понимает, почему я должен использовать declare() в своих тестах (иногда)?или почему мне нужно объявлять (ticks= 1) также в коде, который его использует?это означало бы, что пользователь должен знать, как использовать declare
Решение
Чтобы использовать галочки в глобальной области видимости, они должны быть у вас в начале вызывающего скрипта.Вероятно, именно поэтому вы должны повторно объявить его.Я не могу сказать наверняка, не зная вашего кода.Ниже приведено несколько примеров, которые действительно работают с модульным тестированием.
Вы можете IIRC объявить свои галочки в своем коде с помощью следующей конструкции
function tick_function() {
// Do something
}
register_tick_function('tick_function');
declare (ticks=1) {
// Your code here
}
Или в качестве рабочего примера
function profile_memory()
{
echo '<!--' . memory_get_usage() . '-->';
}
register_tick_function('profile_memory');
declare (ticks=1)
{
$pass = md5('qwerty'); /* Tick executed */
$pass = strrev($pass); /* Tick executed */
echo $pass; /* Tick executed */
}
Это рабочий пример автономной функции tick, которая работает в рамках модульного теста
class TickTest {
private function profile_memory() {
static $i;
++$i;
echo "Tick $i\n";
}
public function __construct() {
}
public function doTicks() {
$register_tick_function = register_tick_function(
array($this,'profile_memory')
);
declare (ticks=1) {
$pass = md5('qwerty'); /* Tick executed */
$pass = strrev($pass); /* Tick executed */
}
}
}
И это модульный тест (и да, я осознаю тот факт, что это не настоящий тест)
require_once 'PHPUnit/Framework.php';
require_once dirname(__FILE__).'/../ticks.php';
class TickTestTest extends PHPUnit_Framework_TestCase {
protected $object;
protected function setUp() {
$this->object = new TickTest;
}
protected function tearDown() {
}
public function testDoTicks() {
$this->object->doTicks();
}
}
Глядя на выходные данные, можно сказать, что функция tick вызывается при выполнении модульного теста.
Некоторые ссылки