Почему PHPUnit игнорирует утверждения при ожидании исключения? - PullRequest
1 голос
/ 11 марта 2010

У меня есть простой пример модульного теста (подробный вопрос здесь ) для класса конфигурации, который по своей конструкции вызывает ошибки PHP при несовпадении типов и неопределенных настройках конфигурации. В дополнение к ошибке метод завершается, возвращая false.

В моем тестовом примере я хочу провести несколько тестов, которые не пройдены. Проблема в том, что я не могу выполнить простое «утверждение» возвращаемого значения: каждая ошибка, возникшая во время выполнения теста, будет преобразована в исключение PHPUnit_Framework_Error.

Теперь я могу сообщить PHPUnit, что я ожидаю ошибку:

/**
 * @expectedException PHPUnit_Framework_Error
 */

public function testSetInvalidKey()
 {
     $this->assertEquals(true, conf::set("invalid_key", "12345"));     
 } 

Это прекрасно работает, но я не понимаю, что любое дополнительное утверждение в этой функции будет , а не . Вне зависимости от того, произойдет ли это или нет, PHPUnit, похоже, только ждет, пока произойдет исключение, и будет удовлетворен всей функцией, когда это произошло.

Этот тест будет работать нормально:

/**
 * @expectedException PHPUnit_Framework_Error
 */

 public function testSetInvalidKey()
 { 
   // The error will be triggered here
   $this->assertEquals(true, conf::set("invalid_key", "12345"));                      
   $this->assertEquals(12345, 67810);   // Huh?    
   $this->assertEquals("abc", "def");   // Huh?
   $this->assertEquals(true, false);    // Huh?

 }

Почему? Это предполагаемое поведение?

Я понимаю, что вы просто разделите утверждения на разные функции, но я хотел бы понять поведение.

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Поскольку conf::set() выполняется в методе testSetInvalidKey(), соответствующий блок catch должен быть снаружи. После обнаружения и регистрации в качестве ожидаемого исключения я не вижу, как PHP может возобновить выполнение после первого утверждения.

Экстремальный псевдо-код:

class Tester
{
  public function run()
  {
    try {
      $test->testSetInvalidKey();
    }
    catch (PHPUnit_Framework_Error $e) {
      // Expected exception caught! Woohoo!
      // How can I continue to run the above method where I left off?
    }
  }
}

Этот тип поведения будет отличным сторонником для тех, кто верит в 1 утверждение на тестовую аксиому.

0 голосов
/ 09 июня 2011

php юнит имеет возможность проверять исключения. Взгляните на:

http://www.phpunit.de/manual/3.2/en/writing-tests-for-phpunit.html

...