2009-09-04 10 views
1

リストと作成のみを使用する非常に単純なフォームをテストしようとしています。これは、コントローラである:リクエストごとにコントローラコンストラクタが呼び出される

public class PositionsController : Controller 
{ 
    private readonly IPositionRepository _positions; 

    // default constructor 
    public PositionsController() 
    { 
     _positions = new TestPositionRepository(); 
    } 

    // DI constructor 
    public PositionsController(IPositionRepository positions) 
    { 
     _positions = positions; 
    } 

    // get a list of all positions 
    public ActionResult Index() 
    { 
     return View(_positions.GetAllPositions()); 
    } 

    // get initial create view 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    // add the new Position to the list 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Position positionToAdd) 
    { 
     try 
     { 
      _positions.AddPosition(positionToAdd); 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 
} 

TestPositionRepositoryは単に私が依存性注入をテストするために作成したモックリポジトリです。新しいエントリを作成しようとすると、インデックスビューに戻されますが、新しいエントリはリストに追加されません。デバッガを使用すると、リンクをクリックするたびに、またはコントローラのコントロール内のリンクに移動するたびにコンストラクタが呼び出されることが表示されます。この問題を解決する方法はありますか?私はそれが間違っていると感じている。私がしようとしているのは、Ninjectを使った依存性注入ですが、私はこれまでこの問題に固執しています。

答えて

1

ほとんどの場合、MockRepositoryはステートレスになります。それで、インデックスに追加されたエントリが表示されないのはなぜですか。私はIndexとCreateを別々にテストします。インデックスの場合は、既存のエントリが正しく表示されているかどうかだけを確認します。これはあなたのMockRepositoryが、GetPositions - Methodのためにそこにハードコーディングされたいくつかの既存のエントリを持つべきであることを意味します。

アプリケーションのフローをテストしたい場合(Create + Indexは何ですか)、実際のリポジトリで統合テストを使用します。

+0

モックリポジトリの状態を静的クラスとして保持する方法はありませんか?私は最初にデータクラスを開発し、すべてが機能していることを確認してから、モデルを使用してデータベーステーブルを設計しようとしています。私の考えは、テーブルを変更するよりもクラスを変更する方が簡単で、モックリポジトリが機能すると、それらをクラスに結び付けるORMを作成するだけです。 –

+0

モックを維持する方法があります。しかし、それは私にとっては良い方法ではないようです。オブジェクトグラフの遅延読み込みや参照を持つオブジェクトの削除など、考慮する必要があるORMの重要な側面について考えてみましょう。ページフローをテストする場合は、このシナリオでは実際のリポジトリのように振る舞うはずです。 TDDを実行するときにモックリポジトリ用の場所がありますが、アプリケーションフローの小さな部分に固執する必要があります。 –

9

なぜこれが問題なのですか?ASP.NET要求の仕組みです。各リクエストは、asp.netページまたはMVCコントローラの独自のインスタンスを実行し、リクエストが完了すると、コントローラは破棄されます。

したがって、作成メソッドでは、新しい位置を追加した後で、リポジトリのsave/commitメソッドを呼び出す必要があります。

+1

ああ、私はそれを知らなかった。私はコントローラがセッションごとに一度だけインスタンス化されたと考えました。私が持っているモックリポジトリは、単にハードコードされたエントリを持つ 'List'です。 'AddPosition'メソッドは' List.Add() 'を実行します。これはうまくいくはずですが、コントローラのコンストラクタはすべてのリフレッシュ時に呼び出されるため、毎回新しいListをインスタンス化します。 –

+1

恐怖ではない - コントローラはWebFormsページのように動作します。モックの目的のために、モックの内容を静的なクラスに入れることができます。私は本当のリポジトリに対してテストするつもりはありません。 – blowdart

関連する問題