PHPSpec Catching TypeError в PHP7

Я хочу протестировать пример метода со скалярным типом и строгими типами в PHP7. Когда я не передаю аргумент, метод должен TypeError . PHPSpec возвращает фатальную ошибку:

Uncaught TypeError: аргумент 1 передан в пример :: test

 <?php class Example { public function test(string $name) { $this->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);

Что не так? Как я могу проверить throwing TypeError ?

Для меня это работает, если я комментирую модульный тест следующим образом:

 /** * @expectedException \TypeError */ 

Тогда мой тест зеленый.

При дальнейшем расследовании это ошибка PHPSpec, и об этом сообщается здесь . Ошибка не была исправлена ​​через несколько месяцев, поэтому я бы предложил прокомментировать ее.

Если вы посмотрите на код в src/PhpSpec/Matcher/ThrowMatcher.php , вы увидите, что PHPSpec ловит Исключения, которые наследуют « Exception », а затем проверяет тип экземпляра этого исключения. Но TypeError не наследует от Exception , он наследует от Error . Единственное, что имеет общее с 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 .