使用 PHPUnit 区分 NULL 和 FALSE


Distinguish between NULL and FALSE with PHPUnit

有谁知道用PHPUnit区分FALSE和NULL的可靠方法吗?

我试图在我的断言中的返回值中区分 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.

这些断言使用将执行类型强制的==。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()));

自己执行比较,并使用严格类型运算符。

$this->assertTrue(false !== null);

http://php.net/operators.comparison

@David对断言相同(+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.