使phpunit捕获php7 TypeError

时间:2015-12-18 07:47:45

标签: phpunit php-7

我试图验证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

是否可以验证此类错误?还有,运行这样的支票是否有意义?

4 个答案:

答案 0 :(得分:17)

是的,您可以像使用for any other exception一样测试TypeError

但是,我不会测试PHP在类型不匹配时发出类型错误。这种测试在PHP 7代码中变得多余。

答案 1 :(得分:5)

可悲的是,TypeError 不是 Exceptionreference)的子类,而是扩展Error。他们真正分享的唯一内容是Throwable界面。 ThrowMatcher实际上无法捕获TypeError。

  

如果你看一下代码   src/PhpSpec/Matcher/ThrowMatcher.php,   您可以看到PHPSpec捕获了继承“Exception”的异常   然后检查该异常的实例类型。

另见this answer

答案 2 :(得分:1)

对于较新的PHP版本,请尝试:

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

答案 3 :(得分:0)

试试这个:

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