我想在PHP7中测试标量类型提示和严格类型的示例方法.当我没有传递参数时,该方法应该抛出一个TypeError
.PHPSpec返回致命错误:
未捕获的TypeError:参数1传递给Example :: test
name = $name; } } class ExampleSpec extends ObjectBehavior { function it_is_initializable() { $this->shouldHaveType('Test\Example'); } function it_check_test_method_when_not_pass_argument() { $this->shouldThrow('\TypeError')->during('test'); } }
一开始我宣布: declare(strict_types=1);
怎么了?我如何测试投掷TypeError
?
经过进一步调查,这是一个PHPSpec错误,已在此处报告.该漏洞在几个月内尚未修复,因此我建议对其进行评论.
如果查看代码src/PhpSpec/Matcher/ThrowMatcher.php
,可以看到PHPSpec捕获继承' Exception
'的异常,然后检查该异常的实例类型.但是,TypeError
不继承Exception
,它继承自Error
.它与a的共同点Exception
是它们都实现了Throwable
接口.
例如:
101 public function verifyPositive($callable, array $arguments, $exception = null) 102 { 103 try { 104 call_user_func_array($callable, $arguments); 105 } catch (\Exception $e) { 106 if (null === $exception) { 107 return; 108 } 109 110 if (!$e instanceof $exception) { 111 throw new FailureException(sprintf( 112 'Expected exception of class %s, but got %s.', 113 $this->presenter->presentValue($exception), 114 $this->presenter->presentValue($e) 115 )); 116 }
报告错误,解释这些细节,并向他们展示有关继承的文档TypeError
.
对我来说,如果我用以下注释单元测试,它就可以工作:
/** * @expectedException \TypeError */
然后我的测试是绿色的。