2013-09-05 9 views
8

Sto guardando PHPUnit e il seguente mi chiede. Fa o no PHPUnit gestire int. 1 e 0 come booleano? Nel mio test corrente, non è così.PHPUnit Assert True One (1)

Esempio: $this->assertTrue(preg_match('/asdf/', 'asdf'));

Nel mio test questo non riesce, come preg_match() sta tornando int 1 o 0 e solo bool false se si verifica un errore.

Prendo i seguenti lavori, ovviamente, poiché i confronti restituiscono sempre bool. $this->assertTrue(preg_match('/asdf/', 'asdf') === 1);

Mi manca qualcosa nel mio preg_match, o la mia affermazione per renderlo .... meno rigoroso?

MODIFICA: Il valore assertTrue richiede che i tipi corrispondano? C'è un modo per rendere meno rigorosa l'asserzione?

risposta

17

PHP ha separato boolean tipo, i suoi valori di TRUE e FALSE (costanti case-insensitive) non sono identici ai valori interi compresi tra 1 e 0.

Quando si utilizza il confronto rigoroso (===), non funziona: TRUE !== 1 e FALSE !== 0.

Quando si utilizza il tipo giocoleria, TRUE viene convertito in 1 e FALSE è convertito a 0 (e, viceversa, 0 viene convertito in FALSE, qualsiasi altro numero intero viene convertito in TRUE). Quindi, TRUE == 1 e FALSE == 0.

In PHPUnit, assertTrue e assertFalse sono controlli dipendenti dal tipo e rigorosi. assertTrue($x) controlla se TRUE === $x, è lo stesso di assertSame(TRUE, $x) e non è lo stesso di assertEquals(TRUE, $x).

Nel tuo caso, un possibile approccio potrebbe essere quello di utilizzare il tipo esplicito casting:

$this->assertTrue((boolean)preg_match('/asdf/', 'asdf')); 

Tuttavia, PHPUnit succede ad avere affermazione dedicato per il controllo di stringa contro espressione regolare:

$this->assertRegExp('/asdf/', 'asdf'); 
3

Si prega di non utilizzare un gruppo di assertTrue o assertFalse verifiche con la logica reale incorporata in una complicata chiamata di funzione quando sono disponibili più funzioni di test specifiche.

PHPUnit ha un insieme molto vasto di asserzioni che sono davvero utili nel caso in cui non vengano soddisfatte. Ti danno un po 'di contesto su cosa è andato storto, cosa che ti aiuta nel debugging.

Per verificare un'espressione regolare, utilizzare assertRegExp() (vedi http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertRegExp)

+0

Questo doesn' t rispondere alla mia domanda, ma sicuramente un commento degno. Grazie, notato. – alairock

+2

'assertTrue' controlla un vero valore' true', non qualcosa di "vero" come "1". – Sven

+0

Per essere più precisi, capisco quello che dici come: "assertTrue" in PHPUnit fa un confronto "triplo-uguale", e non un confronto "doppio-uguale". (Vedi 'var_dump (1 == true);' e 'var_dump (1 === true);' Il primo ritorna vero e il secondo torna falso, poiché un "triple-uguali" corrisponde anche al tipo. domanda: modifico l'originale per essere specifico. – alairock