Как я могу выполнить тест PHPunit для нескольких исключений

Я хочу проверить массив маршрутов, чтобы увидеть, все ли они бросают

AuthenticationException

$routes = [
            'bla/bla/bloe',
            'bla/bla/blie',
             etc..
          ];

public function test_not_alowed_exception(){
    foreach ($routes as $route){
       $this->assertTrowsAuthenticationError($route);
    }
}

public function assertTrowsAuthenticationError($url): void {
    // Tell PHPunit we are expecting an authentication error.
    $this->expectException(AuthenticationException::class);
    // Call the Url while being unauthenticated to cause the error.
    $this->get($url)->json();
}

Мой код отлично работает для первой итерации, однако из-за исключения тест останавливается после первой итерации.

Эта проблема:

  1. Я проверяю на исключение.
  2. Исключение успешно сгенерировано.
  3. PHPUnit останавливает тест. <- Это то, что делают исключения.
  4. Новая итерация должна начаться со следующего URL. Такого не бывает.

Как я могу перебрать набор URL-адресов, чтобы проверить их на наличие AuthenticationException?, Так как первое исключение по дизайну php останавливает сценарий?

1 ответ

Исключение завершит тестирование так же, как исключение завершит выполнение кода. Вы можете поймать только одно исключение за тест.

В общем, когда вам нужно выполнить один и тот же тест несколько раз с разными входными данными, вы должны использовать поставщиков данных.

Вот что вы могли бы сделать:

public function provider() {
      return [
        [ 'bla/bla/bloe' ],
        [ 'bla/bla/blie' ],
         etc..
      ];
}

/**
  *  @dataProvider provider
  */
public function test_not_alowed_exception($route){
     $this->assertTrowsAuthenticationError($route);
}

public function assertTrowsAuthenticationError($url): void {
    // Tell PHPunit we are expecting an authentication error.
    $this->expectException(AuthenticationException::class);
    // Call the Url while being unauthenticated to cause the error.
    $this->get($url)->json();
}
Другие вопросы по тегам