1

アップデート

ファクトリをメソッドの使用法に基づいてユニットテストする必要があるかどうかを確認したいのです。テストする場合は、IoCコンテナ(私の場合はUnityを使用)を使用してタイプを登録する必要があるためです。私がファクトリをあざける場合、それは実際にファクトリメソッドをテストしていません。

以下は、パラメータに基づいて型のインスタンスを作成するファクトリクラスです。

public class CarFactory
    {

        public ICar CreateCar(string CarType)
        {
            ICar Car;

            switch (CarType)
            {
                case RepositoryType.Car1:

                    Car = Ioc.ContainerWrapper.Resolve<Car1>();

                    break;
                case RepositoryType.Car2:       
                    Car = Ioc.ContainerWrapper.Resolve<Car2>();

                    break;

                default:

                    Car = Ioc.ContainerWrapper.Resolve<Car3>();

                    break;

            }

            return Car;
        }

    }


      class Car1 
    {

        private readonly IRepository1 _IRepository1;

        public Car1(IRepository1 repository1)
        {
            _IRepository1 = repository1;

        }
}
4

3 に答える 3

1

私の観点からすると、あなたは正しい道を進んでいます。

ファクトリの目的は、サービス ロケータを呼び出すことができるようにオブジェクトを作成することです (はい、まだサービス ロケータ アンチパターンを使用していますが、ドメインから単なるファクトリに移動しています)。

参照:

https://github.com/ninject/ninject.extensions.factory/wiki

元の質問に戻りますが、工場をテストして、使用するパラメーターに応じて正しいオブジェクトを取得していることを保証する必要があると思います。これが単体テストなのか、何らかの統合テストなのかについては議論があります。私の意見では、このMartin Fowlerの記事に続く単体テストはまだです:

http://martinfowler.com/articles/mocksArentStubs.html#ClassicalAndMockistTesting

これは私がそれをテストする方法です:

IRisk myRisk = new RiskFactory().CreateGoldRisk("Risk1");

myRisk.Should().NotBeNull().And.BeOfType<Risk1>();
于 2012-04-26T16:47:11.110 に答える
1

次のようにテストできませんか?

[設定]
public void セットアップ()
{
  // コンテナーをセットアップするコードをここに....
}

[テスト]
public void example_test()
{
  var factory = new RiskFactory();
  var risk = factory.CreateGoldRisk("xxxx");
  Assert.True(リスクはRisk1);
}

余談ですが。IOC コンテナーがあります。工場で包装されるコンテナラッパー。あなたのアーキテクチャには、おそらく抽象化のレイヤーが多すぎます..

于 2012-04-26T10:03:07.683 に答える
1

このテストに適したコンテナーを準備する必要があります (つまり、Riskクラスを解決可能にする必要があります)。現在の実装では、他にできることはあまりありません。

もちろん、これがもはや単体テストであるかどうかという疑問が生じますが、Unity は十分にテストされており、機能すると仮定できます (つまり、単体テストの失敗点になる可能性はないと仮定します)。

これは、コード内で IoC コンテナーに強く依存することの当然の欠点です。カスタムの抽象化でコンテナをラップして、それを注入できると主張する人もいるかもしれません。これは正しくないと感じており、私はまだ誰かがそうしているのを見たことがありません.

関連する問題については、この質問を参照してください。

于 2012-04-26T10:01:50.763 に答える