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

phpunit:静态法测试的最佳实践,php,oop,testing,phpunit,Php,Oop,Testing,Phpunit,PHPUnit 3.7 三周以来,我一直在使用PHPUnit进行测试,并且做了很多简单的单元测试(也使用dataPrividers)——我喜欢它 在过去的日子里,我一直在努力模拟对象-没有成功:-( 我想测试以下静态函数:Tools::getValue();。它获取一些对象和该对象的属性名称,做一些事情,并返回属性值。我经常使用这些函数 是用getMock测试它吗?我到现在还没有成功,阅读也没有帮助 # Tools.php <?php class User { publi

PHPUnit 3.7

三周以来,我一直在使用PHPUnit进行测试,并且做了很多简单的单元测试(也使用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;
       }
}
#Tools.php

好吧,我没有找到其他解决方案,尽管我认为我做测试的方式不是很好——也许这是最好的解决办法

在PHPUnit文档中,我发现:

限制:final、private和static方法

请注意,final、private和static方法不能被存根或模拟


我不是舒尔,但对我来说,用PHPUnit测试依赖对象的静态方法似乎是不可能的。

你说你三周前开始用PHPUnit测试。你为什么选择多年不支持的PHPUnit版本?在我的Linux发行版上,我有PHP5.5.9,我正在使用composer安装phpunit、selenium、dbunit…composer在我选择phpunit 3.7之前一直存在冲突。现在升级整个开发IDE时,我不得不继续我的项目,担心时间问题。没有好主意?phpunit 4.8在PHP5.3、PHP5.4、PHP5.5和PHP5.6上受支持。好的,我重新安装了composer,更改了配置…这次编写r安装了phpunit 4.8:-)现在请回到我上面的问题。
# 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);           
    }
}