TDDアプリケーションで依存関係を初期化するのは誰ですか?


8

私はモック/偽のオブジェクトでTDDを実装することを学ぼうとしています。私が持っている質問の1つは、TDDを実装するアプリケーションで依存関係を初期化する方法です。この記事の例 Moq 3でモックを開始すると、次のようになります。

public class OrderWriter
{
    private readonly IFileWriter fileWriter;

    public OrderWriter(IFileWriter fileWriter)
    {
        this.fileWriter = fileWriter;
    }

    public void WriteOrder(Order order)
    {
        fileWriter.WriteLine(String.Format("{0},{1}", order.OrderId, order.OrderTotal));
    }
}

この例では、コンストラクターがIFileWriterパラメーターを取ります。実際のアプリケーションの場合は実際のファイルライターを、単体テストの場合は偽のファイルライターを提供するためです。私の質問は、実際のアプリケーションでは、誰がこのパラメーターを提供するのですか?このアプリケーションの呼び出し元になると思います。コンストラクタにも依存関係がある場合はどうなりますか?呼び出し元のコードもそれに責任がありますか?

たぶん、より良い方法は、ファクトリーを使用することです。この工場はどのように機能しますか?そして、工場はどのように分配されますか?上記の方法のようにコンストラクターパラメーターにありますか?

回答:


7

あなたが探しているのは、アプリケーションの起動時にすべてのオブジェクトを自動配線するIoCコンテナです。Ninjectを見てください。フロントページに非常に単純な例があります。(それはまた良い製品であり...そして、忍者!)

一般的なルールとして、すべての最上位オブジェクト(ASP.NETのページ、ASP.NETのMVCのコントローラー、Winformsのフォームなど)をIoCコンテナーから直接解決して、すべてのコンストラクター注入による依存関係。下位レベルのアイテムを解決するように強制する必要がある場合があります-これはサービスロケーターとしての使用として知られています -しかし、テストするのが難しい(不可能ではない)ため、これは一般的には避けください。もしあなたがそうでなければ、消費者を混乱させる可能性のあるAPIを作成します。

ASP.NET for MVCは、v3以降、コードの残りの部分からIoCコンテナーを抽象化し、DependencyResolverを介してトップレベルクラス(コントローラー、ビュー、フィルターなど)に自動注入できるように特別に設計されていますクラス。他の.NETフレームワークはもう少し手間がかかりますが、Googleを使用している場合は可能です。

.NETのDependency Injectionという本に関する本があります。個人的には読んだことがありませんが、良いことは聞いています。


0

デフォルトのインスタンスでパラメーター化されたコンストラクターを呼び出すデフォルトのコンストラクターを追加するアプローチ、つまり「貧乏人の依存性注入」を見てきました。

public OrderWriter()
    : this(new TextFileWriter())
{
}

通常のコードパスはデフォルトのコンストラクターを呼び出しますが、単体テストはカスタムコンストラクターを使用して初期化します。

誰かがこのアプローチの長所と短所について詳しく説明できたら、私はそれを高く評価します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.