集成测试而不是单元测试

时间:2016-11-07 22:13:42

标签: php unit-testing phpunit

让我们假设我有一个自定义集合对象。如何为remove方法创建单元测试(没有依赖项)?我必须先调用add方法才能删除该项,因此remove方法依赖于add方法。在大多数情况下,此自定义集合类将具有受保护的属性,其中包括所有添加的集合项。因此,我无法模拟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;
    }
}

我可以使用对象聚合并将一组收集项传递给构造函数,并将其用作此自定义集合对象的初始集合项,但如果add方法可能修改多个对象属性,则可能会出现问题。那么你将如何解决这个任务,或者只是一个集成测试呢?感谢您的反馈!

1 个答案:

答案 0 :(得分:2)

如果Item足够简单,不必担心并发症,整合测试也没问题。编写一些测试以首先测试Item,然后测试customCollection。如果Item测试运行正常且customCollection测试失败,则错误最有可能发生在集合中。

如果Item非常复杂,那么让它实现集合所需的接口,然后您可以通过此接口的简单实现来存根Item。然后分别测试Item和简单的实现,然后使用简单的实现进行集合,之后再使用Item实现。 (但我怀疑这是值得的。)

分离单元测试和集成测试的重点在于容易定位错误的位置。但是,只有通过结构良好的集成测试才能实现相同的目标,这很好。