我有一个简单的类:
class Subject {
/** @var ValueObject[] */
private $collection = [];
function addToCollection (array $whatver) {
if (array_key_exists($whatever, 'smth')) {
$collection[] = new ValueObject($whatever);
return true;
}
return false;
}
}
我知道我可以简单地将ValueObject传递给方法,但现实生活addToCollection()
有点复杂。
是否可以使用PHPUnit测试此方法,或者我应该在考虑DI的情况下重做它?
由于
答案 0 :(得分:1)
您可以使用外部注入的工厂构建ValueObject
个实例。如果没有注入,则可以在内部创建默认的ValueFactory:
class Subject {
/** @var ValueObject[] */
private $collection = [];
/** @var ValueFactory */
private $valueFactory;
public function getValueFactory() {
if (!isset($this->valueFactory)) {
$this->valueFactory = new ValueFactory();
}
return $this->valueFactory;
}
public function setValueFactory(ValueFactory $factory) {
$this->valueFactory = $factory;
}
function addToCollection (array $whatever) {
if (array_key_exists($whatever, 'smth')) {
$collection[] =
$this->getValueFactory()->buildValueObject($parameters);
return true;
}
return false;
}
}
现在,在测试中,您可以模拟ValueFactory并将其注入Subject,这样您就可以检查实例的创建方式并控制返回的ValueObject实例。
答案 1 :(得分:1)
在你的情况下,我会说测试这门课很容易。 你有一个成功返回bool的方法。您没有任何getter或setter,因此您需要检查的是方法的返回值。其他所有内容都是实现细节,因此无需对其进行测试。
如果你有依赖关系,你可以通过构造函数来模拟它们,但是从你添加方法的角度来看它没有改变。
另一个建议是考虑单一责任原则。您正在向集合添加内容,但在创建对象之前也要做一些魔术。 将对象的创建移动到另一个类(如工厂)并保持您的类简单 - 只需将对象添加到集合中。 使用这种方法,您将不会拥有依赖项,并且您的代码将很容易测试。