14

私はPHPUnitを見ていますが、次のことを疑問に思っています。PHPUnit が int を処理するかどうか。ブール値としての 1 と 0 ? 私の現在のテストでは、そうではありません。

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

私のテストでは、preg_match() は int 1 または 0 を返し、エラーがある場合は bool false のみを返すため、これは失敗します。

比較は常にブール値を返すため、明らかに次のように動作します。$this->assertTrue(preg_match('/asdf/', 'asdf') === 1);

私の preg_match に何か欠けているのでしょうか、それともそれを作るための私のアサーション.... それほど厳密ではありませんか?

編集: assertTrue はタイプが一致する必要がありますか? アサーションの厳密性を下げる方法はありますか?

4

2 に答える 2

29

PHP には別のboolean型があり、その値TRUEFALSE(大文字と小文字を区別しない定数) は整数値の 1 と 0 と同じではありません。

厳密な比較 ( ===) を使用すると、機能しません: TRUE !== 1and FALSE !== 0.

型ジャグリングを使用すると、TRUEは 1 に変換され、FALSEは 0 に変換されます (逆に、0 は に変換されFALSE、他の整数は に変換されTRUEます)。だから、TRUE == 1そしてFALSE == 0

PHPUnit では、assertTrueassertFalseは型に依存する厳密なチェックです。は、 と同じか、 と同じではassertTrue($x)ないかをチェックします。TRUE === $xassertSame(TRUE, $x)assertEquals(TRUE, $x)

あなたの場合、可能なアプローチの 1 つは、明示的な型キャストを使用することです。

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

ただし、PHPUnit にはたまたま正規表現に対して文字列をチェックするための専用のアサーションがあります。

$this->assertRegExp('/asdf/', 'asdf');
于 2013-09-05T21:57:49.003 に答える