我试图验证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
是否可以验证此类错误?还有,运行这样的支票是否有意义?
答案 0 :(得分:17)
是的,您可以像使用for any other exception一样测试TypeError
。
但是,我不会测试PHP在类型不匹配时发出类型错误。这种测试在PHP 7代码中变得多余。
答案 1 :(得分:5)
可悲的是,TypeError
不是 Exception
(reference)的子类,而是扩展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);