2013-09-05 10 views
8

Patrzę na PHPUnit i dalej mnie zastanawiasz. Czy lub nie PHPUnit obsługuje int. 1's i 0's jako boolean? W moich obecnych testach nie ma.PHPUnit potwierdzić True One (1)

Przykład: $this->assertTrue(preg_match('/asdf/', 'asdf'));

W moich testów nie powiedzie się, jak preg_match() jest zwrócenie int 1 lub 0 i tylko bool false, jeśli jest błąd.

Podejmuję się następujących prac, oczywiście, ponieważ porównania zawsze zwracają bool. $this->assertTrue(preg_match('/asdf/', 'asdf') === 1);

Czy brakuje mi czegoś w mojej preg_match, czy też mojego stwierdzenia, aby to zrobić ... mniej surowe?

EDYTOWANIE: Czy assertTrue wymaga dopasowania typów? Czy istnieje jakiś sposób, aby uczynić twierdzenie mniej surowym?

Odpowiedz

17

PHP oddzielny boolean typ jego wartości TRUE i FALSE (wielkość niewrażliwe stałych) nie są identyczne z całkowitych wartości 1 i 0.

Podczas korzystania ze ścisłego porównania (===) nie działa: TRUE !== 1 i FALSE !== 0.

Gdy typ zastosowania żonglerka, TRUE przekształca się od 1 do FALSE przekształca 0 (i, na odwrót, przekształca się w 0 FALSE każda inna liczba całkowita jest przekształcany do TRUE). Tak więc, TRUE == 1 i FALSE == 0.

W PHPUnit, assertTrue i assertFalse są zależne od rodzaju, ścisłe kontrole. assertTrue($x) sprawdza, czy TRUE === $x, jest taki sam jak assertSame(TRUE, $x) i nie jest taki sam jak assertEquals(TRUE, $x).

W twoim przypadku, jedną z możliwych podejście byłoby użyć wyraźny typ rzucania:

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

Jednak PHPUnit zdarza mieć dedykowany twierdzenie do sprawdzania ciąg przeciwko wyrażenia regularnego:

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

Proszę nie używać wielu czeków assertTrue lub assertFalse z prawdziwą logiką osadzoną w skomplikowanym wywołaniu funkcji, gdy dostępne są bardziej szczegółowe funkcje testowe.

PHPUnit ma bardzo szeroki zestaw asercji, które są bardzo pomocne w przypadku, gdy nie są spełnione. Dają ci sporo kontekstu, co poszło nie tak, co pomaga ci w debugowaniu.

Aby sprawdzić regularnych ekspresji wykorzystać assertRegExp() (patrz http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertRegExp)

+0

to robi” t odpowiedzieć na moje pytanie, ale zdecydowanie warty uwagi. Dziękuję, zauważyłem. – alairock

+2

'assertTrue' sprawdza prawdziwą" prawdziwą "wartość, a nie" prawdę "jako" 1 ". – Sven

+0

Mówiąc dokładniej, rozumiem, co mówisz: 'asertTrue' w PHPUnit robi porównanie" potrójnie równe ", a nie" podwójnie równe "porównanie. (Zobacz 'var_dump (1 == true);' i 'var_dump (1 === true);" Pierwszy powraca true, a drugi wraca false, ponieważ "triple-equals" również pasują do typu. pytanie. Będę edytować oryginał tak, by był konkretny. – alairock