2016-11-07 3 views
0

Предположим, у меня есть собственный объект коллекции. Как я могу создать единичный тест (без зависимостей) для метода удаления? Сначала я должен вызвать метод add, чтобы потом удалить этот элемент, и поэтому метод remove имеет зависимость от метода add. В большинстве случаев этот класс пользовательской коллекции будет иметь защищенное свойство, которое включает все добавленные элементы коллекции. Поэтому я не могу высмеять метод добавления, потому что у меня нет элементов коллекции для удаления.Интеграционный тест вместо модульного теста

class Item 
{ 
    private $identifier; 

    public function __construct($identifier) 
    { 
     $this->identifier = $identifier; 
    } 

    public function getIdentifier() { return $this->identifier; } 
    ... 
} 

class customCollection 
{ 
    protected $items = []; 
    public function add($item) { 
     $this->items[$item->getIdentifier()] = $item; 
    } 
    public function remove($item) { 
     unset($this->items[$item->getIdentifier()]); 
    } 
    public function getItems() 
    { 
     return $this->items; 
    } 
} 

Я мог бы использовать агрегацию объекта и передать массив элементов коллекции конструктору и использовать это в качестве исходных элементов коллекции этого объекта на заказ коллекции, но это может быть проблемой, если метод добавить, возможно, изменить несколько свойств объекта , Итак, как бы вы решили эту задачу или это просто тест интеграции для этого? Спасибо за отзывы!

+0

Выполнение модульного тестирования предполагает интенсивное использование mocks для замещения зависимостей. я не вижу, чтобы этот конкретный случай был особенным для того, чтобы не следовать этому предложению. просто пара строк и ваш тест в безопасности (и ваш производственный код тоже). – xmike

ответ

2

Если Item достаточно прост, не утруждайте себя усложнениями и интеграционным тестом. Напишите несколько тестов для тестирования Item, а затем проверьте customCollection. Если тесты Item выполняются нормально и customCollection тест не удается, ошибка, скорее всего, будет в коллекции.

Если Item очень сложный, пусть он реализует интерфейс, необходимый для коллекции, а затем вы можете заглушить Item с тривиальной реализацией этого интерфейса. Затем выполните тест Item и тривиальную реализацию отдельно, а затем сбор с тривиальной реализацией, а затем и с реализацией Item. (Но я сомневаюсь, что это стоит усилий.)

Точка разделения модульных тестов и интеграционных тестов находится в легкой локализации, где ошибка. Но это нормально, если вы достигнете того же самого результата только с хорошо структурированными интеграционными тестами.

+0

благодарит вас за отзыв. Моя забота относится к методу удаления коллекции. Мне нужно вызвать функцию add, чтобы заполнить свойство items, и если в этом методе есть некоторая ошибка, тест на удаление также завершится неудачно, хотя он будет работать отлично, а сбой произойдет только из-за ошибки в реализации метода add. – K4rl1

+0

Я бы испытал оба метода вместе. Сначала добавьте некоторые элементы, затем проверьте, правильно ли они вставлены, затем «удалить» их и снова проверить. Я не вижу в этом ничего плохого, и я не вижу другого варианта. Не стоит делать слишком большие и слишком сложные тесты, но это не так - у вас есть два дополнительных действия, имеет смысл протестировать их вместе. –