我有一个与此类似的课程(为简洁起见,删除了一些逻辑):
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 只是为了测试目的而更改公共接口,我不确定我对此有何感受。从表面上看,它们似乎是非常通用、有用的方法,但在我的特殊情况下,我不需要检查Foo
集合中特定实例的存在,也不需要检索所有实例,所以它真的会只是臃肿。此外,似乎如果我在一次测试中测试界面的多个部分,我并不是真的在测试一个“单元”,但这或多或少只是一种哲学上的挂断。
选项#3 对我来说似乎很尴尬。
选项 #4 是一个非常糟糕的主意,我什至不应该列出它,因为即使在这里提出建议我也不会这样做。