Я хочу протестировать пример метода со скалярным типом и строгими типами в 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
.