2015-03-27 4 views
2

У меня есть простой класс, как:PHPUnit: как вы можете протестировать метод с помощью экземпляра класса?

class Subject { 
    /** @var ValueObject[] */ 
    private $collection = []; 

    function addToCollection (array $whatver) { 
     if (array_key_exists($whatever, 'smth')) { 
      $collection[] = new ValueObject($whatever); 
      return true; 
     } 
     return false; 
    } 
} 

Я знаю, что я мог бы просто передать ValueObject методу, но в реальной жизни addToCollection() является немного более сложным.

Возможно ли вообще протестировать этот метод с помощью PHPUnit или я должен переделать его с помощью DI?

Благодаря

+0

Несомненно, это возможно проверить, однако его невозможно проверить самостоятельно. Является ли 'ValueObject' частью вашего API? – hek2mgl

+0

Если у вас есть getter для Collection [], вы можете получить его после 'addToCollection' и утверждать, что он был создан с правильными аргументами. иначе вы могли бы просто утвердить ответ true/false. – DanR

ответ

1

Вы можете построить ValueObject экземпляры при помощи извне впрыскивается Factory. Дефолт ValueFactory может быть создан внутри, если никто не впрыскивается:

class Subject { 

    /** @var ValueObject[] */ 
    private $collection = []; 

    /** @var ValueFactory */ 
    private $valueFactory; 

    public function getValueFactory() { 
     if (!isset($this->valueFactory)) { 
      $this->valueFactory = new ValueFactory(); 
     } 
     return $this->valueFactory; 
    } 

    public function setValueFactory(ValueFactory $factory) { 
     $this->valueFactory = $factory; 
    } 

    function addToCollection (array $whatever) { 
     if (array_key_exists($whatever, 'smth')) { 
      $collection[] = 
       $this->getValueFactory()->buildValueObject($parameters); 
      return true; 
     } 
     return false; 
    } 
} 

Теперь в тесте вы можете издеваться над собой ValueFactory и внедрить его к подлежащему, так что вы можете проверить, как создаются экземпляры и получить контроль над вернувшимися экземплярами ValueObject.

1

В вашем случае я бы сказал, что этот класс легко проверить. У вас есть метод, который возвращает bool при успехе. У вас нет получателей или сеттеров, поэтому все, что вам нужно проверить, - это возвращаемое значение из вашего метода. Все остальное представляет собой деталь реализации, поэтому нет необходимости ее проверять.

Если у вас есть зависимости, вы можете имитировать их через конструктор, но он меняет nothig с точки зрения вашего метода добавления.

Другое предложение - подумать о принципе единой ответственности. Вы добавляете что-то в коллекцию, но также делаете магию, прежде чем создавать объект. Переместите создание объекта в другой класс (например, на заводе) и сохраните класс просто - просто добавьте объект в коллекцию. При таком подходе у вас не будет и зависимостей, и ваш код будет легко протестирован.

Смежные вопросы