2013-09-05 8 views
8

Ich schaue PHPUnit und das folgende hat mich wundernd. Behandelt oder behandelt PHPUnit nicht int. 1 und 0 als Boolean? Bei meinen aktuellen Tests ist dies nicht der Fall.PHPUnit Assert True One (1)

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

In meinen Tests dies nicht gelingt, wie preg_match() wird int 1 oder 0 zurückkehrt und nur falsch Bool, wenn ein Fehler auftritt.

Ich nehme es die folgenden Arbeiten, offensichtlich, da Vergleiche immer Bool zurückgeben. $this->assertTrue(preg_match('/asdf/', 'asdf') === 1);

Fehle ich etwas in meinem preg_match, oder meine Behauptung, es zu machen .... weniger streng?

EDIT: Benötigt assertTrue Typen übereinstimmen? Gibt es eine Möglichkeit, die Behauptung weniger streng zu machen?

Antwort

17

PHP hat separate boolean-Typ, dessen Werte von TRUE und FALSE (Groß- und Kleinschreibung Konstanten) sind nicht identisch mit ganzzahlige Werte von 1 und 0 (http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertRegExp sehen).

Wenn Sie strengen Vergleich verwenden (===), funktioniert es nicht: TRUE !== 1 und FALSE !== 0.

Beim Typ juggling verwenden, TRUE zu 1 umgewandelt wird, und auf 0 FALSE umgewandelt wird (und vice versa, 0 bis FALSE umgewandelt wird, wird eine andere ganze Zahl TRUE umgewandelt). Also, TRUE == 1 und FALSE == 0.

In PHPUnit, assertTrue und assertFalse sind typabhängige, strenge Kontrollen. assertTrue($x) prüft, ob TRUE === $x, es ist das gleiche wie assertSame(TRUE, $x), und nicht dasselbe wie assertEquals(TRUE, $x).

In Ihrem Fall ein möglicher Ansatz explizite Typumwandlung nutzen würde:

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

jedoch geschieht PHPUnit für dedizierte Behauptung haben Zeichenfolge gegen regulären Ausdruck überprüft:

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

Bitte verwenden Sie eine Reihe von assertTrue oder assertFalse Überprüfungen mit der echten Logik, die in einem komplizierten Funktionsaufruf eingebettet ist, wenn spezifischere Testfunktionen verfügbar sind.

PHPUnit hat eine sehr große Anzahl von Aussagen, die wirklich hilfreich sind, wenn sie nicht erfüllt werden. Sie geben Ihnen eine Menge von Kontext, was schief gelaufen ist, was Ihnen beim Debuggen hilft.

für einen regulären Ausdruck zu überprüfen, verwenden assertRegExp()

+0

Diese doesn‘ t meine Frage beantworten, aber auf jeden Fall ein würdiger Kommentar. Danke, vermerkt. – alairock

+2

'assertTrue' prüft nach einem echten" wahren "Wert, nicht nach etwas" truthy "wie" 1 ". – Sven

+0

Um genauer zu sein, verstehe ich, was Sie sagen als: 'assertTrue' in PHPUnit macht einen" Triple-equal "Vergleich und nicht einen" Doppel-gleich "Vergleich. (Siehe 'var_dump (1 == true);' und 'var_dump (1 === true);' Der erste kommt wieder wahr und der zweite kommt falsch zurück, da ein "triple-equals" auch dem Typ entspricht. So ist mein Frage: Ich werde das Original so bearbeiten, dass es so spezifisch ist. – alairock