【问题标题】:phpunit: Best practice for testing static methodphpunit:测试静态方法的最佳实践
【发布时间】:2017-01-15 04:48:37
【问题描述】:

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 类或我用来构建测试所需对象的其他类 - 我认为这不是一个好的测试设计。

在这种情况下我如何模拟一个对象或者在这种情况下什么是好的测试实践?

【问题讨论】:

  • 您说您在三周前开始使用 PHPUnit 进行测试。为什么选择多年不支持的 PHPUnit 版本?
  • 在我的 Linux 发行版上,我有 php 5.5.9,我正在使用 composer 安装 phpunit、selenium、dbunit,...在我选择 phpunit 3.7 之前,composer 显示冲突。当我现在升级我的整个开发中的 IDE 时,我必须更进一步地处理我的项目并担心时间问题。没有好主意?
  • PHPUnit 4.8 在 PHP 5.3、PHP 5.4、PHP 5.5 和 PHP 5.6 上受支持。
  • 好的,我重新安装了composer,更改了配置......这次composer安装了phpunit 4.8 :-) 现在请回到我上面的问题。

标签: php oop testing phpunit


【解决方案1】:

好的,我没有找到其他解决方案,尽管我认为我进行测试的方式不是很好 - 也许这是最好的解决方法。

在我发现的 PHPUnit-Documentation 上:

限制:final、private 和 static 方法

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

我不太确定,但在我看来,使用 PHPUnit 测试具有对象依赖关系的静态方法似乎是不可能的。

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2021-12-24
    • 1970-01-01
    • 2017-05-23
    • 2020-02-28
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多