让我们假设我有一个自定义集合对象。如何为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方法可能修改多个对象属性,则可能会出现问题。那么你将如何解决这个任务,或者只是一个集成测试呢?感谢您的反馈!
答案 0 :(得分:2)
如果Item
足够简单,不必担心并发症,整合测试也没问题。编写一些测试以首先测试Item
,然后测试customCollection
。如果Item
测试运行正常且customCollection
测试失败,则错误最有可能发生在集合中。
如果Item
非常复杂,那么让它实现集合所需的接口,然后您可以通过此接口的简单实现来存根Item
。然后分别测试Item
和简单的实现,然后使用简单的实现进行集合,之后再使用Item
实现。 (但我怀疑这是值得的。)
分离单元测试和集成测试的重点在于容易定位错误的位置。但是,只有通过结构良好的集成测试才能实现相同的目标,这很好。