我有類似這樣的(爲簡潔一些邏輯刪除)類:如何測試一個集合類使用PHPUnit
class FooCollection {
protected $_foos;
public function __construct() {
$this->_foos = new SplObjectStorage();
}
public function addFoo(FooInterface $foo) {
$this->_foos->attach($foo);
}
public function removeFoo(FooInterface $foo) {
$this->_foos->detach($foo);
}
}
我想用PHPUnit的測試addFoo()
和removeFoo()
方法,我是想知道做這件事最好的策略是什麼?據我所知,我只有幾個選項:
- 添加一個方法
hasFoo(FooInterface $foo)
並檢查後添加。 - 添加方法
getFoos()
,直接返回SplObjectStorage
實例,並檢查添加後是否在$foo
之內。 - 嘗試
removeFoo($foo)
後addFoo($foo)
並檢查是否有異常。 - 將
$_foos
設爲公共屬性,並在添加後直接檢查(壞,壞,壞...)。
選項#1和#2正在改變公共界面僅用於測試目的,我不確定我對此的看法。它們看起來像是非常普通且有用的方法,但在我的具體情況中,我從來沒有必要檢查集合中是否存在特定的實例,也沒有檢索所有實例,所以它真的只會膨脹。另外,似乎如果我在一次測試中測試接口的多個部分,我並不真正測試一個「單元」,但這或多或少只是一個哲學掛斷。
選項#3對我來說似乎很尷尬。
選項#4是一個非常糟糕的主意,我不應該把它列出來,因爲即使它在這裏被建議,我也不會這樣做。
我敢肯定,集合類有一些返回集合中的項目。否則,班級將是無用的。並且不要改變你的代碼以便能夠測試它(除非你以其他方式搞砸了你的設計,以防止你測試它) – PeeHaa
@PeeHaa:它沒有包含任何檢索項目的方法(因爲存在不需要這樣做)。它確實包含了對集合進行*操作的方法(我忽略了這些方法,因爲它們不相關),這就是爲什麼它不是「無用」類。 – FtDRbwLXw6
有點不相干,但在我的辯護中,你可能想給你的班級在那種情況下更好的名字;) – PeeHaa