2014-12-16 4 views
5

Я пытаюсь проверить методы из следующего класса я написал (есть больше функций, чем то, что показано, в основном, одна функция для каждого является _ *() метод):Как PHPUnit проверить метод без возвращаемого значения?

class Validate { 
    private static $initialized = false; 

    /** 
    * Construct won't be called inside this class and is uncallable from the outside. This prevents 
    * instantiating this class. This is by purpose, because we want a static class. 
    */ 
    private function __construct() {} 

    /** 
    * If needed, allows the class to initialize itself 
    */ 
    private static function initialize() 
    { 
    if(self::$initialized) { 
     return; 
    } else { 
     self::$initialized = true; 
     //Set any other class static variables here 
    } 
    } 

    ... 

    public static function isString($string) { 
    self::initialize(); 
    if(!is_string($string)) throw new InvalidArgumentException('Expected a string but found ' . gettype($string)); 
    } 

    ... 

} 

Когда я проверить, если методы вызывают исключение из недопустимого ввода, он отлично работает! Однако, когда я проверяю, работает ли метод, как ожидается, PHPUnit жалуется, потому что у меня нет утверждений в тесте. Специфическая ошибка:

# RISKY This test did not perform any assertions 

Однако, у меня нет никакой ценности отстаивать против, так что я не знаю, как это преодолеть.

Я читал некоторые о тестировании статических методов, но в основном это касается зависимостей между статическими методами. Кроме того, даже нестатические методы не могут иметь возвращаемого значения, поэтому как это исправить?

Для справки, мой тестовый код:

class ValidateTest extends PHPUnit_Framework_TestCase { 
    /** 
    * @covers ../data/objects/Validate::isString 
    * @expectedException InvalidArgumentException 
    */ 
    public function testIsStringThrowsExceptionArgumentInvalid() { 
    Validate::isString(NULL); 
    } 

    /** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
    Validate::isString("I am a string."); 
    } 
} 
+2

Почему этот метод не возвращает true/false? Почему бы это исключение, когда в качестве параметра передается значение, отличное от строки, так как очевидно, что метод проверки, если что-то является строкой, должен ожидать значения, отличные от строки, или нет метода для метода. Это похоже на плохо продуманный метод. –

+0

@MikeBrant Он не возвращается, потому что ему не нужно. Я использую метод в своем коде как break/assert - если метод не генерирует исключение, мой код продолжает работать как обычно. Если это так, исключение должно быть рассмотрено. Нет никакой причины возвращать что-либо из этих методов и даже меньше причин писать операторы if/else и проводить циклы, проверяя эти возвращаемые значения. Я хочу исключение вместо TRUE/FALSE, потому что исключения могут остановить выполнение кода. Если вы поместите int, где массив должен идти в Java (или на большинстве типизированных языков), вы получаете исключение. Мне нужна аналогичная функциональность. –

+0

@MikeBrant Кроме того, надлежащее тестирование означает, что мой метод работает как с недопустимым, так и с допустимым вводом. –

ответ

3

Одно из решений я пришел на это следующее, основываясь на example 2.12 from chapter 2 of PHPUnit. Мне кажется, что он немного взломан, но это лучшее, что я нашел до сих пор. Также, основываясь на этом PHPUnit Gitub issue discussion, кажется, что некоторые другие люди хотят эту функцию, но нет планов ее реализации.

Изменение testIsStringNoExceptionArgumentValid() к следующему:

/** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
    try { 
     Validate::isString("I am a string."); 
    } catch (InvalidArgumentException $notExpected) { 
     $this->fail(); 
    } 

    $this->assertTrue(TRUE); 
    } 
+1

Вам не нужен бит try/catch. Нет необходимости сбой(), исключение сделает это. –

+0

Как протестировать метод, который ничего не возвращает и не вызывает каких-либо исключений – Somar

2

испытания функции ничтожной с assertNull:

/** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
     $this->assertNull(Validate::isString("I am a string.")); 
    } 
1

Чтобы предотвратить предупреждение об утверждениях можно использовать @doesNotPerformAssertions аннотацию, как описано в документации : https://phpunit.de/manual/current/en/appendixes.annotations.html#idp1585440

Или, если вы предпочитаете код над аннотацией: $this->doesNotPerformAssertions();

Смежные вопросы