2009-12-22 6 views
6

Ho creato una classe di gestione del segnale utilizzando pcntl_signal che ora voglio usare per SIGALRMin che modo la dichiarazione di php (tick) funziona davvero?

il problema che ho è che il mio test PHPUnit per testare la signalclass funziona (dove im utilizzando solo dichiarare zecche nella signalclass), ma la TestClass per testare la classe di segnalazione, che a sua volta utilizzando il doesnt signalclass se aggiungo dichiarare (zecche = 1) nei miei alarmtests funziona anche

ho pensato di dichiarazione delle zecche è necessaria solo al codice di gestione del segnale, che nel mio caso è nella signalclass? ma per quanto posso vedere è anche necessario per il codice che chiama il codice di gestione del segnale non funziona nemmeno nella mia sveglia, devo metterlo nella mia classe alarmtest !?

ospitarci usando strace il segnale viene consegnato indipendente da zecche

quindi chiunque capisce il motivo per cui devo usare declare() nel mio test (a volte)? o perché devo dichiarare (tick = 1) anche nel codice che lo usa? vorrebbe dire che un utente ha bisogno di sapere come utilizzare dichiarare

+0

cura di fornire un certo codice? – Gordon

+0

@Gordon dai un'occhiata ai miei esempi sotto –

+0

Hai funzionato? –

risposta

6

Per utilizzare zecche nell'ambito globale si deve avere nella all'inizio dello script di chiamata. Questo è probabilmente il motivo per cui devi ridichiarlo. Non posso dirlo con certezza senza conoscere il tuo codice. Di seguito sono riportati alcuni esempi che funzionano con i test unitari.

È possibile IIRC dichiarare sei zecche nel codice dal seguente costrutto

function tick_function() { 
    // Do something 
} 

register_tick_function('tick_function'); 

declare (ticks=1) { 
    // Your code here 
} 

O come un esempio di lavoro

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 */ 
} 

Questo è un esempio di lavoro di una funzione di segno di spunta autonomo che sta lavorando all'interno di un'unità di test

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 */ 
     } 
    } 
} 

E questo è il test di unità (e sì sono consapevole del fatto che non è una prova reale)

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

Guardando all'uscita funzione tick è chiamata durante l'esecuzione del test di unità.

Alcuni riferimenti

+0

sembra giusto aggiunta declare (tick = 1); nella parte superiore della classe testunit funziona così come lo vedo, se si tenta di utilizzare la funzionalità ticking (estensione pcntl) in classi/funzioni è necessario definire le zecche a livello globale prima di chiamare tali funzioni! non funzionava nemmeno se chiamassi declare (tick = 1); all'interno di una funzione che a sua volta ha chiamato la mia classe di segnale in modo da avere un caso d'uso molto specifico per i tick, quindi puoi usare {} per un blocco tick o dichiararlo nella parte superiore degli script usando thx per l'aiuto –