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 ответ

  1. Хорошо, я не нашел другого решения, и хотя я думаю, что способ, которым я сделал тест, не очень хорош — возможно, это лучший обходной путь.

    На PHPUnit-документация найдена:

    Ограничение: конечные, частные и статические методы

    Обратите внимание, что окончательные, частные и статические методы не могут быть стерты или высмеяны

    Я не совсем уверен, но мне кажется, что тестирование статических методов с зависимостями от объектов невозможно с помощью PHPUnit.