使用 PHPUnit 区分 NULL 和 FALSE

发布于 2024-11-06 10:19:24 字数 1899 浏览 0 评论 0原文

有谁知道用 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.

Does anyone know a reliable way to distinguish between FALSE and NULL with PHPUnit?

I'm trying to distinguish from NULL and FALSE in return values in my assertions.

This fails:

$this->assertNotEquals(FALSE, NULL);

And these assertions pass:

$this->assertFalse(NULL);
$this->assertNull(FALSE);

Edit: For some context, this is to distinguish between an error state (FALSE) versus an empty result (NULL). To ensure the function is returning properly, I need to distinguish between the two.
Thanks

Edit...
As per some of the problems regarding what I am testing, I'm adding the tests.

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");
    }
}

And the results.

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

余厌 2024-11-13 10:19:24

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

These assertions use == which will perform type coercion. Hamcrest has identicalTo($value) which uses ===, and I believe PHPUnit has assertSame($expected, $actual) which does the same.

self::assertSame(false, $dao->getUser(-2));

Update: In answer to your comment, "It can be NULL or an object":

$user = $dao->getUser(-2);
self::assertTrue($user === null || is_object($user));

Using Hamcrest assertions is a little more expressive, especially in the event of a failure:

assertThat($dao->getUser(-2), anyOf(objectValue(), nullValue()));
半世蒼涼 2024-11-13 10:19:24

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

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

http://php.net/operators.comparison

Execute the comparison yourself, and use the strict type operator.

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

http://php.net/operators.comparison

雄赳赳气昂昂 2024-11-13 10:19:24

@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.

@David is right with assertSame (+1), it will do === strict comparison for you.


But let me ask you:

Which version of phpunit are you using?

This assertion:

$this->assertFalse(null);

should produce and error!

Sample Code:

<?php

class mepTest extends PHPUnit_Framework_TestCase {

    public function testFalseNull() {
        $this->assertFalse(null);
    }

    public function testNullFalse() {
        $this->assertNull(false);
   }
}

Results in:

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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文