1

最終的にテスト用のモックオブジェクトを作成できるようにインターフェイスを開発するようにプロジェクトを再構築しようとしていますが、いくつかの概念の実装/理解に問題があります。によって実装されたIProductsインターフェースがありますProducts。しかし、明らかに、私はモック Products オブジェクトを作成できるようにしたいと考えています。

実装ではなくインターフェイスに依存するようにするにはどうすればよいですか?

public void AddNewProduct()
        {
            IDatabase db = new Database();
            IProducts products = new Products();
            products.addProductsToCache();
        }

MockDatabaseつまり、代わりにオブジェクトを使用するには、このコードをどのように指定すればよいでしょうか。

4

2 に答える 2

0

テストしたい Inventory クラスがあるとします。Inventory は IProducts に依存しています。したがって、使用する Iproducts のどの実装を気にする必要はありません。重要なのは、それが IProducts のインスタンスでなければならないということだけです。本番環境では、IProducts のインスタンスは Products のインスタンスになります。テストでは、モック Iproducts のインスタンスになります。

インターフェイス (IProducts) を導入しても、Inventory がまだ具体的な Products クラスに依存している場合、インターフェイスは役に立ちません。実装ではなく、インターフェースのみに依存する必要があります。

于 2013-02-13T14:57:45.570 に答える
0

製品をメソッドに渡します。

public class YourProductContainerClass
{
    private readonly IDatabase _database;
    private readonly IProducts _products;

    public YourProductContainerClass(
        IDatabase database,
        IProducts products)
    {
        _database = database;
        _products = products;
    }

    public void AddNewProduct(IProduct product)
    {
        products.Add(product);
    }
}

それにちょうど私の2セント。interface「後でテストを作成する可能性があるため」という理由だけで作成することはありません。単体テストを作成するため、インターフェイスが必要です。

単体テストを作成していない場合は、インターフェイスも作成しません。

なぜだめですか?あらゆる種類の理由で、単体テストの必要性が十分な優先度を得られない可能性が非常に高いためです。次に、(LoC の量を増やす以外に) デザインに実際に何かを追加するわけではありませんが、コード + インターフェイスを更新するためのメンテナンス コストが発生します。

だから、私見:関数の前にテストを書くことに慣れてください。なんらかの理由で単体テストの必要性が見られない場合は、クラスのインターフェイスを作成することに意味があるかどうかも検討してください。

PS: のようなツールをResharper使用すると、後でインターフェイスを簡単に抽出し、レガシーをインターフェイスにリファクタリングできます。これは TDD の魅力でもあり、多くの手間がかかりません。

于 2013-02-13T15:55:53.363 に答える