phpunit:测试静态方法的最佳实践

时间:2017-01-15 04:48:38

标签: php oop testing phpunit

PHPUnit 3.7

三个星期以来,我正在使用PHPUnit进行测试并做了很多简单的Unittest(也有dataPrividers) - 我喜欢它。

我努力模仿物体的最后几天 - 没有成功: - (

我想测试以下静态函数:Tools::getValue();。它获取一些对象和该对象的属性名称,执行一些操作,并返回该属性的值。我经常使用这些功能。

是用getMock测试吗?直到现在我都没有成功,阅读没有帮助。

# Tools.php
<?php
  class User
  {
     public $lastname, $city;
  }

  class Tools
  {
     /**
      * Gets an attribute of my_object -> trimms the spaces and gives it back in uppercase.
      * This work for any object/attribute.
      * 
      * @param type $my_object 
      * @param string $attribute is a name of an attribute of my_object
      * @return string 
      */
      public static function getValue($my_object, $attribute)
      {
         $value = $my_object->$attribute;
         $ret = strtoupper(trim($value));
         return $ret;
       }
}

它有效:

# use.php
<?php
$teacher = new User();
$teacher->lastname = "Kennwood";
$teacher->city = "New York";
echo Tools::getValue($teacher, "lastname");

// Result KENNWOOD

测试也有效 - 但我认为在这种情况下我的方式不行:

# ToolsTest.php
<?php
class ToolsTest extends PHPUnit_Framework_TestCase
{
    public function testGetValue()
    {
        $teacher = new User();
        $teacher->lastname = "Kennwood";
        $teacher->city = "New York";

        $actual = Tools::getValue($teacher, "lastname");
        $this->assertEquals("KENNWOOD", $actual);           
    }
}

它有效,但不好的是这个测试取决于类User或我用来构建测试所需对象的其他类 - 我认为这不是一个好的测试设计。

在这种情况下,我如何模拟此案例的对象或什么是良好的测试习惯?

1 个答案:

答案 0 :(得分:0)

好吧,我没有找到其他解决方案,虽然我认为我做测试的方式并不是很好 - 也许它是最好的解决方法。

在PHPUnit-Documentation上我找到了:

  

限制:final,private和static方法

     

请注意,最终的私有和静态方法不能被存根或模拟

我不是很害羞,但对我而言,听起来好像使用PHPUnit来测试具有对象依赖性的静态方法。