2011-12-13 8 views
2

私はDIを初めて使い、コントローラーの単体テストの最善の戦略について質問があります。DIを使用してASP.NETでユニットをテストするための最善の戦略

私はDIを使ってリポジトリ、マッピングエンジン、ロガーを取得するコントローラを持っています。これは基本的に私がKozmicsサンプルアプリケーションからそれを学んだ方法です。

private readonly IRepository repository; 
private readonly IMappingEngine mappingEngine; 
private readonly ILogger logger; 

public DossierController(IRepository repository, IMappingEngine mappingEngine, ILogger logger) 
{ 
    this.repository = repository; 
    this.mappingEngine = mappingEngine; 
    this.logger = logger; 
} 

ここでは、文書を保存するためのメソッドがあります。このメソッドの中で、dossiermodelは一式にマップされ、データベースに保存されます。

[HttpPost] 
[ActionName("Dossier")] 
[AcceptVerbs(HttpVerbs.Post)] 
[AcceptParameter(Name = "button", Value = "save")] 
public ActionResult Dossier_Save(string button, DossierModel dossierModel, string returnUrl) 
{ 
    if (!Request.IsAuthenticated) 
    return RedirectToAction("Index", "Home"); 

    if (!ModelState.IsValid) return View(dossierModel); 

    Dossier dossier = mappingEngine.Map<DossierModel, Dossier>(dossierModel); 
    dossier.DigitaleHandtekeningDatum = new DateTime(2011, 11, 11); 

    repository.TransactionBegin(); 
    repository.Save(dossier); 
    repository.TransactionCommit(); 

    return View(); 
} 

私は2つのことを確認するために、コントローラをテストしたい:関係書類が正しくマッピングされていることを1と2の関係書類が実際に完全にデータベースに保存されていること。

今私の質問です:これのための最良の戦略は何ですか?すべきか:

  • ユニット全体としてコントローラをテストしますか?そしてもしそうなら、どのように?
  • 永続性を模倣しますか?次に、オブジェクトが実際に永続化されているかどうかをテストしますか?

これは、特にデータベースの永続性をテストするための個別のユニットテストで行う必要がありますか?

答えて

0

まずは、Request.IsAuthenticatedをテストするのではなく、[Authorize]属性を使用したいと思います。これは、Requestオブジェクト全体を模擬する複雑さを取り除きます。

私は、リポジトリを模擬し、Saveメソッドは、(あなたがテストしているユースケースに応じて、呼び出されたりしない)正しいパラメータで呼び出されることをテストう

+0

リクエストはASP.NET MVCでは静的ではありません。 –

+0

ああ、それでも、それを嘲笑するのは難しいです。 (havvent mvcで今、しばらくの間働いた、ちょうどそれがテストするのは簡単ではないことを思い出した)。私の答えを固定した –

0

私は考えていないユニットテストこの。このブログでユニットテストのコストと利点の視覚化を見てみましょう:http://blog.stevensanderson.com/2009/11/04/selective-unit-testing-costs-and-benefits/。私は、コントローラは通常、グラフのコーディネータのように、高いレベルの依存性と低いレベルの複雑さを持っていると主張します。ユニットテストはアルゴリズム、ステートマシンなどのように実際に恩恵を受けるコードに保存してください。コントローラーレベルでブラウザーの自動化を使用してコントローラーロジックを統合テストしたり、コントローラーレベルで操作したい場合はhttp://blog.stevensanderson.com/2009/06/11/integration-testing-your-aspnet-mvc-application/などを使用できます。

関連する問題