2016-01-02 5 views
7

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

Uncaught TypeError: Argument 1 passed to Example::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);

Что не так? Как проверить бросание TypeError?

+0

Итак, исключение бросается, но не получается? Или это не бросается, и это должно быть? – Will

+0

Метод throw TypeError, и я хочу catch TypeError. Я хочу использовать $ this-> shouldThrow ('\ TypeError') -> во время ('test'). Этот метод в PHPSpec работает, когда метод возвращает исключение, но не TypeError. – Matrix12

+0

Вы используете самую последнюю версию PHPSpec? – Will

ответ

3

Для меня это работает, если я аннотировать модульное тестирование с этим:

/** 
* @expectedException \TypeError 
*/ 

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

5

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

Если вы посмотрите на код в 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    } 

Сообщить о ошибке, объяснить эти детали, и показать им this documentation о наследовании TypeError.

+1

Я сообщил об этой ошибке. Я не знаю, когда эта ошибка будет исправлена. – Matrix12

+0

@ Matrix12 Вы можете поймать (Ошибка $ e), чтобы поймать Ошибки ... или любой конкретный класс, который взаимодействует с Throwable –