如何 PHPUnit 测试一个没有返回值的方法?

2022-08-30 19:15:18

我正在尝试测试我编写的以下类中的方法(基本上,每个is_*()方法都有一个函数,比显示的函数更多):

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.");
  }
}

答案 1

要防止出现有关断言的警告,您可以使用文档中所述的注释:https://phpunit.de/manual/current/en/appendixes.annotations.html#idp1585440@doesNotPerformAssertions

或者,如果您更喜欢代码而不是注释:$this->doesNotPerformAssertions();


答案 2

使用 assertNull 测试 void 函数:

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

推荐