2011-12-30 5 views
3

私の単体テストでは、私はAssemblyInitialize,ClassInitializeTestInitializeのようなものを使ってテストを設定します。 AssemblyInitialize私は、サービス、作業単位とリポジトリ(すべてUnity/Dependency Injection)の作成のために、いくつかのシングルトンファクトリを初期化します。私のTestInitializeでは、各テストが独立して実行できることを確認する必要があるという状態を明確にします。テスト可能性を向上させるために使い捨て依存関係を構築する場所はどこですか?

トラフStackoverflow私は次の記事を回った:Writing Testable CodeHow to Think About the “new” Operator with Respect to Unit Testing。私は書いたコードについてどう思うかを変更したと言わなければならないが、私の心はまだ鳴っている。

はたとえば、次のコードを取る:私は心の中で以前の記事で一種のこのタイプを変更する必要がありますどのように

Presenter = new MyPresenter(this); 
if (!IsPostback) 
{ 
    presenter.PrepareView(); 
} 

をこのようにaspxページで使用されている

public class MyPresenter : BasePresenter<IMyView> 
{ 
    public MyPresenter(IMyView view) 
     : base(view) 
    { 
    } 

    public void PrepareView() 
    { 
     using (IMyService service = ServiceFactory.Instance.CreateService<IMyService>()) 
     { 
      View.Data = service.GetData(); 
     } 
    } 
} 

? PrepareViewメソッドにサービスインスタンスを渡す必要がありますか?しかし、私のASPXページでは、サービスや工場について知り、使用後に処分する必要があります。

シングルトン工場ではどうしたらよいですか?それをクラスのプロパティにして、それをUnityに注入しますか?

私は2つだけのオプションを参照

答えて

3

私はこの種の依存関係を慎重に解決しました。念頭に置いて依存関係を調べたり、注入したりしてください。

あなたは違いを見ることができますが、サービスロケータはblogは、よりになり、これは.NETの依存性注入のための本質的な目的と実践をクリア読んで、アンチパターンであるという点で、データへのアクセスを持つ、MVPパターンを壊さないでしょう

+0

記事で言及されているGuiceのようなNinjectですか?私はそれを見てみましょう。 –

+1

はい、それです。 –

-3

  1. が直接サービスの依存関係を注入する(ただし、ASPXレベルのサービスを解決好きではないことを述べた)プレゼンターで
  2. パスはDIコンテナを抽象化して、解決使用しているので、私は2番目のオプションを好むだろう

(APIは明確ではないだろうので、同様にこの方法が好きではありませんが、あなたが言及した)プレゼンターにおける依存性はので、各発表者は、依存関係それが必要と認識していますDIコンテナ(ユニty)シングルトンファクトリを取り除き、Unity内のすべてのファクトリを登録するだけで、必要な場所にアクセスし、頭痛のないコードを単体テストすることができます(シングルトーンが少ないため)。だから、

class Presenter 
{ 
    public Presenter(IView, IDiContainerAbstraction container) 
    ... 
} 

Presenter = new MyPresenter(this, unityContainer); 
public void PrepareView()  
{ 
    using (IMyService service = this.unityContainer.Resolve<IMyService>()) 
    { 
     View.Data = service.GetData(); 
    } 
} 

を だから各プレゼンターにDIコンテナを渡す特定のプレゼンターのために必要なすべてのサービスを解決し、次に2番目のパラメータとして及び(あなたがASPXページにこのすべてを維持したくないと指摘考慮して)
  • あなたはユニットテストしながらプレゼンターモックでできpassignだろうインタフェースによって抽象化DIコンテナので
  • 可能ユニット・テストを行いませんsingletoneの依存関係
+0

景色? – Magnus

+0

サービスが複数の機能で使用される場合はどうなりますか?私は私のASPXコードビハインドでこの種のコードを取得するのが好きではありません。その後Webプロジェクトに突然WCFライブラリへの参照があります。 –

+0

コンストラクタ – sll

関連する問題