Различают NULL и FALSE с помощью PHPUnit - PullRequest
13 голосов
/ 12 мая 2011

Кто-нибудь знает надежный способ различения FALSE и NULL с помощью PHPUnit?

Я пытаюсь отличить NULL и FALSE в возвращаемых значениях в моих утверждениях.

Это терпит неудачу:

$this->assertNotEquals(FALSE, NULL);

И эти утверждения проходят:

$this->assertFalse(NULL);
$this->assertNull(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.

Ответы [ 3 ]

19 голосов
/ 12 мая 2011

В этих утверждениях используется ==, который будет выполнять приведение типов. 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()));
6 голосов
/ 12 мая 2011

Выполните сравнение самостоятельно и используйте оператор строгого типа.

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

http://php.net/operators.comparison

1 голос
/ 12 мая 2011

@ Дэвид прав с 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...