Различать NULL и FALSE с помощью PHPUnit
Кто-нибудь знает надежный способ отличить FALSE и NULL от PHPUnit?
Я пытаюсь отличить от NULL и FALSE в возвращаемых значениях в моих утверждениях.
Это не удается:
$this->assertNotEquals(FALSE, NULL);
И эти утверждения проходят:
$this->assertFalse(NULL);
$this->assertNull(FALSE);
Изменить: для некоторого контекста это должно отличать состояние ошибки (FALSE) от пустого результата (NULL). Чтобы функция возвращалась должным образом, мне нужно провести различие между ними.
Благодаря
Изменить...
В соответствии с некоторыми проблемами в отношении того, что я тестирую, я добавляю тесты.
Class testNullFalse extends PHPUnit_Framework_TestCase{
public function test_null_not_false (){
$this->assertNotEquals(FALSE, NULL, "False and null are not the same");
}
public function test_null_is_false (){
$this->assertFalse(NULL, "Null is clearly not FALSE");
}
public function test_false_is_null (){
$this->assertNull(FALSE, "False is clearly not NULL");
}
public function test_false_equals_null(){
$this->assertEquals(FALSE, NULL, "False and null are not equal");
}
public function test_false_sameas_null(){
$this->assertSame(FALSE, NULL, "False and null are not the same");
}
public function test_false_not_sameas_null(){
$this->assertNotSame(FALSE, NULL, "False and null are not the same");
}
}
И результаты.
PHPUnit 3.5.10 by Sebastian Bergmann.
FFF.F.
Time: 0 seconds, Memory: 5.50Mb
There were 4 failures:
1) testNullFalse::test_null_not_false
False and null are not the same
Failed asserting that <null> is not equal to <boolean:false>.
2) testNullFalse::test_null_is_false
Null is clearly not FALSE
Failed asserting that <null> is false.
3) testNullFalse::test_false_is_null
False is clearly not NULL
Failed asserting that <boolean:false> is null.
4) testNullFalse::test_false_sameas_null
False and null are not the same
<null> does not match expected type "boolean".
FAILURES!
Tests: 6, Assertions: 6, Failures: 4.
Ответы
Ответ 1
В этих утверждениях используется ==
, который будет выполнять принуждение типа. Hamcrest имеет identicalTo($value)
, который использует ===
, и я считаю, что PHPUnit имеет assertSame($expected, $actual)
, который делает то же самое.
self::assertSame(false, $dao->getUser(-2));
Обновление: В ответ на ваш комментарий "Это может быть NULL или объект":
$user = $dao->getUser(-2);
self::assertTrue($user === null || is_object($user));
Использование утверждений Hamcrest является немного более выразительным, особенно в случае сбоя:
assertThat($dao->getUser(-2), anyOf(objectValue(), nullValue()));
Ответ 2
Выполните сравнение самостоятельно и используйте оператор строгого типа.
$this->assertTrue(false !== null);
http://php.net/operators.comparison
Ответ 3
@David прав с assertSame (+1), он будет выполнять === строгое сравнение для вас.
Но позвольте мне спросить вас:
Какую версию phpunit вы используете?
Это утверждение:
$this->assertFalse(null);
должен произвести ошибку!
Пример кода:
<?php
class mepTest extends PHPUnit_Framework_TestCase {
public function testFalseNull() {
$this->assertFalse(null);
}
public function testNullFalse() {
$this->assertNull(false);
}
}
Результаты в:
phpunit mepTest.php
PHPUnit 3.5.12 by Sebastian Bergmann.
FF
Time: 0 seconds, Memory: 3.00Mb
There were 2 failures:
1) mepTest::testFalseNull
Failed asserting that <null> is false.
/home/.../mepTest.php:6
2) mepTest::testNullFalse
Failed asserting that <boolean:false> is null.
/home/.../mepTest.php:10
FAILURES!
Tests: 2, Assertions: 2, Failures: 2.