让 phpunit 捕获 php7 TypeError
Make phpunit catch php7 TypeError
我正在尝试验证 php7 函数只接受整数。
这是class:
<?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
是否可以验证此类错误?另外,运行 这样的支票有意义吗?
是的,您可以像使用 for any other exception 一样测试 TypeError
。
但是,我不会测试 PHP 在类型不匹配的情况下发出类型错误。这种测试对于 PHP 7 代码变得多余。
遗憾的是,TypeError
不是 Exception
(reference) 的子类,而它扩展了 Error
。他们唯一真正共享的是 Throwable
界面。 ThrowMatcher 实际上无法捕获 TypeError。
If you look at the code in
src/PhpSpec/Matcher/ThrowMatcher.php
,
you can see that PHPSpec catches Exceptions that inherit 'Exception
'
and then checks the instance type of that exception.
另见 。
试试这个:
$this->expectException(TypeError::class);
对于较新的 PHP 版本尝试:
$this->expectError(TypeError::class);
我遇到了类似的情况,我试图抓住 TypeError
,但 PHP 根本没有抛出它。事实证明,出于某种原因 error_reporting
指令被设置为排除 E_NOTICE
.
当我在 php.ini
中设置 error_reporting = E_ALL & ~E_DEPRECATED
时,它开始按预期工作。因此,只需确保 E_ERROR
、E_WARNING
、E_NOTICE
之类的内容不会被排除在您的 error_reporting
设置中。
只需使用:
$this->expectError(TypeError::class);
但别忘了把它放在之前你的函数调用
我正在尝试验证 php7 函数只接受整数。
这是class:
<?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
是否可以验证此类错误?另外,运行 这样的支票有意义吗?
是的,您可以像使用 for any other exception 一样测试 TypeError
。
但是,我不会测试 PHP 在类型不匹配的情况下发出类型错误。这种测试对于 PHP 7 代码变得多余。
遗憾的是,TypeError
不是 Exception
(reference) 的子类,而它扩展了 Error
。他们唯一真正共享的是 Throwable
界面。 ThrowMatcher 实际上无法捕获 TypeError。
If you look at the code in
src/PhpSpec/Matcher/ThrowMatcher.php
, you can see that PHPSpec catches Exceptions that inherit 'Exception
' and then checks the instance type of that exception.
另见
试试这个:
$this->expectException(TypeError::class);
对于较新的 PHP 版本尝试:
$this->expectError(TypeError::class);
我遇到了类似的情况,我试图抓住 TypeError
,但 PHP 根本没有抛出它。事实证明,出于某种原因 error_reporting
指令被设置为排除 E_NOTICE
.
当我在 php.ini
中设置 error_reporting = E_ALL & ~E_DEPRECATED
时,它开始按预期工作。因此,只需确保 E_ERROR
、E_WARNING
、E_NOTICE
之类的内容不会被排除在您的 error_reporting
设置中。
只需使用:
$this->expectError(TypeError::class);
但别忘了把它放在之前你的函数调用