2012-02-03 7 views
0

テストコードを書きたいと思っています。しかし、私のアクションは私のDataContextに結合されています。依存関係を削除するにはどうしたらいいですか?コントローラの依存関係をどのように切り離すことができますか?

public ViewResult About() 
    { 
     var db = new CamaDataContext(); 

     var item = new PropertyViewModel(); 


     AutoMapper.Mapper.Map(db.dataProperty.FirstOrDefault(),item); 

     return View(item); 
    } 

答えて

1

ninjectやstructuremapなどの依存性注入フレームワークを使用してコントローラーのコンストラクターに渡すと、テストを書くときに思考コンストラクターにその依存関係を渡すことができます。

これも

2
  1. 異なるエンティティのリポジトリインタフェースを作成します。

  2. 異なるエンティティのコンクリートリポジトリを作成します。

  3. これらのリポジトリをコントローラレベルで保存します。

  4. コントローラのコンストラクタを使用して、リポジトリを注入できるようにします(指定されていない場合はコンクリート実装を使用します)。

これにより、ユニットテスト中にリポジトリをモックして、2つが強く結合しないようにすることができます。

+0

リポジトリもそうでない場合、彼がリポジトリ(彼はトランザクションサポートを望んでいない限り)と混合データベース・コードを持っています、作業単位に関連付けする必要があります。 –

+0

@ChristopherHarris - 私はその部分を残しました。それはすべてシステムの構築方法に依存します。彼らがDependency Injectionを使用している場合、リポジトリがContextを気にしないようにコンテキストを管理する責任を負うことができます。 –

+0

私のレポを作業単位に関連付けることによって誰かが何を意味するかを詳しく説明できますか? –

1

のテスト中に、データベースへの呼び出しを行う必要があり、実際にあなたがそれをテストするために、容易に上記のコードをリファクタリングすることができ、あなたにそれらのdepenedenciesをモックする機会を提供していないでしょう(にあなたが持っているいくつかのビジネス・ロジックを想定しテスト)。すべてのロジックは、Xエンティティで渡すクラスに移動されます。その後、クラスを実装して送信するだけで、ロジックをテストするだけです。

代わりに、コントローラのアクションは非常に軽いので、テストする必要はありません。

また別のノートで、あなたのコンテキストクラスを処分:使用

(VARデシベル=新しいCamaDataContext()) { .. リターンビュー(..) } を

アクションの方法をより細かく保つために、ここに示す[AutoMap()]属性も考慮してください。

http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

そのようなテストを必要としないように私は、コントローラ内の2つのラインの方法をコンテンツになります。

1

マイクロソフトではこの点で素晴​​らしいチュートリアルを用意しています。それは完全に真っ直ぐではありませんが、授業の勉強や練習に取り入れようとすると、それをうまく理解するのに役立ちます。

Entity Frameworkに固有ですが、原則はEF以外の作業にも適用されます。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

関連する問題