как объявления PHP (галочки) действительно работают? - PullRequest
6 голосов
/ 22 декабря 2009

я создал класс обработки сигналов, используя pcntl_signal, который теперь я хочу использовать для сигалрма

проблема у меня в том, что мой phpunit-тест для тестирования класса сигналов работает (где я использую тиклы объявления в классе сигналов), но тестовый класс для тестирования класса тревоги, который, в свою очередь, не использует сигнальный класс если я добавлю объявить (тики = 1) в моих тестах тревоги, это также работает

Я думал, что объявление тиков необходимо только в коде обработки сигналов, который в моем случае находится в классе сигналов? но, насколько я вижу, это также необходимо для кода, который вызывает код обработки сигналов это даже не работает в моем классе тревоги, я должен поместить это в мой класс тревоги!?

хотя при использовании strace сигнал доставляется независимо от тиков

так что кто-нибудь понимает, почему я должен использовать объявить () в моих тестах (иногда)? или почему я должен объявить (ticks = 1) также в коде, который его использует? это означало бы, что пользователь должен знать, как использовать объявить

1 Ответ

6 голосов
/ 22 декабря 2009

Чтобы использовать тики в глобальной области видимости, они должны быть в начале вызывающего скрипта. Вероятно, поэтому вы должны переопределить его. Я не могу сказать наверняка, не зная вашего кода. Ниже приведены некоторые примеры работы с модульным тестированием.

Вы можете объявить 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 */
}

Это рабочий пример автономной функции тиков, которая работает в рамках модульного теста

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();
    }
}

Глядя на вывод, функция тика вызывается при выполнении модульного теста.

Некоторые ссылки

...