2

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 /*...*/;
    }
}

または、一緒に暮らすことができるいくつかの依存関係のようなものがありますか?

4

1 に答える 1

4

2番目のオプションは、バリデーターをモックして、実際のオブジェクトの代わりにモックされたオブジェクトを注入できるため、単体テストがはるかに簡単になります。

最初のオプションを単体テストしようとすると、Thing クラスとそれが依存するすべてのもの (バリデーターなど) をテストすることになります。単体テストが失敗した場合は、すべての依存関係を通じて失敗を追跡する必要があります。

依存性注入のポイントは、クラスを依存関係から分離して、各クラスを分離してテストできるようにすることです。

したがって、テストの観点からは、常にすべての依存関係を注入する必要があります。

于 2012-05-21T17:48:54.383 に答える