SimpleTest: Как утверждать, что выдается ошибка PHP? - PullRequest
7 голосов
/ 04 марта 2009

Если я прав, SimpleTest позволит вам утверждать, что выдается ошибка PHP. Тем не менее, я не могу понять, как его использовать, основываясь на документации. Я хочу утверждать, что объект, который я передаю в мой конструктор, является экземпляром MyOtherObject

class Object {
    public function __construct(MyOtherObject $object) {
        //do something with $object
    }
}

//...and in my test I have...
public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
    $notAnObject = 'foobar';
    $object = new Object($notAnObject);
    $this->expectError($object);
}

Куда я иду не так?

Ответы [ 4 ]

13 голосов
/ 18 марта 2009

Тип подсказки бросает E_RECOVERABLE_ERROR, который может быть перехвачен SimpleTest начиная с версии PHP 5.2. Следующее будет ловить любую ошибку, содержащую текст «должен быть экземпляром». Конструктор PatternExpectation принимает регулярное выражение perl.

public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
    $notAnObject = 'foobar';
    $this->expectError(new PatternExpectation("/must be an instance of/i"));
    $object = new Object($notAnObject);
}
2 голосов
/ 05 марта 2009

Оказывается, SimpleTest фактически не поддерживает это. Вы не можете поймать фатальные ошибки PHP в SimpleTest. Подсказка типа отличная, только вы не можете ее проверить. Подсказка типа приводит к фатальным ошибкам PHP.

2 голосов
/ 04 марта 2009

PHP имеет как ошибки, так и исключения, которые работают немного по-другому. Передача неверного типа в функцию с типом подсказки вызовет исключение. Вы должны поймать это в вашем тестовом случае. Eg.:

public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
  $notAnObject = 'foobar';
  try {
    $object = new Object($notAnObject);
    $this->fail("Expected exception");
  } catch (Exception $ex) {
    $this->pass();
  }
}

или просто:

public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
  $this->expectException();
  $notAnObject = 'foobar';
  $object = new Object($notAnObject);
}

Но учтите, что это остановит тест после строки, где происходит исключение.

1 голос
/ 05 марта 2009

вы должны ожидать ошибку до того, как она произойдет, тогда SimpleTest проглотит ее и посчитает проход, если тест завершается и ошибки нет, то она не будет выполнена. (есть ожидаемые ошибки и ожидаемые исключения, которые действуют одинаково для PHP (не фатальных) ошибок и исключений, соответственно.)

...