Я пытаюсь проверить методы из следующего класса, который я написал (есть больше функций, чем показано, в основном одна функция для каждого – это метод _ * ()):
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.12 из главы 2 PHPUnit . Мне кажется, что он немного взломан, но это лучшее, что я нашел до сих пор. Кроме того, на основе этого обсуждения проблемы с PHPUnit Gitub кажется, что некоторые другие люди хотят эту функцию, но нет планов ее реализации.
Измените testIsStringNoExceptionArgumentValid () на следующее:
/** * @covers ../data/objects/Validate::isString */ public function testIsStringNoExceptionArgumentValid() { try { Validate::isString("I am a string."); } catch (InvalidArgumentException $notExpected) { $this->fail(); } $this->assertTrue(TRUE); }
в состоянии/** * @covers ../data/objects/Validate::isString */ public function testIsStringNoExceptionArgumentValid() { try { Validate::isString("I am a string."); } catch (InvalidArgumentException $notExpected) { $this->fail(); } $this->assertTrue(TRUE); }
Проверить функцию void с помощью assertNull :
/** * @covers ../data/objects/Validate::isString */ public function testIsStringNoExceptionArgumentValid() { $this->assertNull( Validate::isString("I am a string.") ); }