二传手、验证器和依赖注入


setter, validator and dependency injection

假设我有一个 Thing 类,我需要使用扩展Zend_Validate_Abstract的 MySpecificDateValidation 类提供的一些特定日期验证。

在 Thing 类中,我正在考虑依赖注入,并想知道这段代码是否:

public function SetDateBegin($dateBegin) {
    $dateValidator = new MySpecificDateValidation();
    if ($dateValidator->isValid($dateBegin)) {
        $this->dateBegin = $dateBegin;
    } else {
        throw new Exception /*...*/;
    }
}

应重构为:

public function SetDateBegin($dateBegin, MySpecificDateValidation $dateValidator) {
    if ($dateValidator->isValid($dateBegin)) {
        $this->dateBegin = $dateBegin;
    } else {
        throw new Exception /*...*/;
    }
}

或者有一些你可以忍受的依赖性?

您的第二个选项将更容易进行单元测试,因为您将能够模拟验证器并注入模拟对象而不是真实对象。

如果你尝试对第一个选项进行单元测试,你最终会测试Thing类以及它所依赖的任何内容,例如验证器。如果单元测试失败,则必须通过所有依赖项跟踪失败。

依赖关系注入的要点是允许您将类与其依赖项隔离开来,以便隔离测试每个类。

因此,从测试的角度来看,您应该始终注入所有依赖项。