Сделать PHPUnit поймать php7 TypeError

Я пытаюсь проверить, что функция php7 принимает только целые числа.

Это класс:

<?php

declare(strict_types=1);

class Post
{
    private $id;

    public function setId(int $id)
    {
        $this->id = $id;
    }
}

и это испытание:

<?php

declare(strict_types=1);

class PostTest extends PHPUnit_Framework_TestCase
{
    private function getPostEntity()
    {
        return new Post();
    }

    public function testSetId()
    {
        $valuesExpected = [123, '123a'];
        foreach ($valuesExpected as $input) {
            $this->getPostEntity()->setId($input);
        }
    }
}

ошибка, которую я получаю:

TypeError: Argument 1 passed to Post::setId() must be of the type integer, string given, called in /path/test/PostTest.php on line 35

можно ли проверить такую ошибку? кроме того, есть ли смысл проводить такую проверку?

3 ответов


Да, вы можете проверить TypeError Так же, как вы бы использовали для любого другого исключения.

однако я бы не стал проверять, что PHP выдает ошибку типа в случае несоответствия типов. Это своего рода тест, который становится излишним с кодом PHP 7.


к сожалению, TypeError не подкласс Exception (ссылка), в то время как он расширяет Error. Единственное, что они действительно разделяют, это Throwable интерфейс. ThrowMatcher не может фактически поймать TypeError.

если вы посмотрите на код в src/PhpSpec/Matcher/ThrowMatcher.php, вы можете видеть, что PHPSpec ловит исключения, которые наследуют"Exception' а затем проверяет тип экземпляра этого исключения.

посмотреть также ответ.


попробуйте это:

$this->expectException(TypeError::class);