0

IoCとDIを組み合わせたMVCを学習しようとしています。私のプロジェクトでは、Castle、Automapper、NHibernate、NHibernateIntegrationも使用します。ユニットテストのMVCコントローラ

Kozmicの優れたサンプル "ToBeSeen"アプリのおかげで、私は解決策がかなり整ったと思います。しかし、コントローラメソッドレベルで基本的なセーブ操作をユニットテストしたいと思っています。私はちょうどこれについて行く方法を取得しないでください。私は自分の問題がかなりシンプルだと思っていますが、これは初心者でも助けてもらえます。

私はこのようなdossiercontroller持って:あなたはそれがrepostitory、mappingengineとロガーを必要と見ることができるように

[Authorize] 
    [Transactional] 
    public class DossierController : BaseController 
    { 
     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; 
     } 

を。私が理解しているように、これはすべて実行時に構成され、配線されています。

 [HttpPost] 
     [ActionName("Dossier")] 
     [Transaction] 
     [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); 

      repository.Save(dossier); 

      return View(); 
     } 

は、ここで私はちょうど関係書類にdossiermodelを自動マップし、リポジトリを使用して、それを保存したい:

次は私が関係書類を保存するために使用され、コントローラメソッドを持っています。

Nunitを使用してこれをユニットテストしたいと思います。私は何も馬鹿にしたくない、私はコントローラーレベルから本当のパーシスタンステストをしたい。このために、私は新しい議事管理官を作成し、正しい議論を伝えなければなりません。今私は失った。 Webアプリケーションのように正しく動作するように、引数を作成して構成するにはどうすればよいですか。たとえば、UnittestでAutomapperを正しく設定するにはどうすればよいですか?正しく設定されたリポジトリを作成するにはどうすればよいですか?私はコンテナを使うべきですか?

どのようなヘルプ、具体的には、コード例が高く評価されています!

ありがとうございます。

答えて

0

何か気にかけたくない場合は、コントローラのコンストラクタに必要なサービスの具体的なバージョンをインスタンス化する必要があります。

IRepository repository = GetRepository(); 
IMappingEngine mappingEngine = GetMappingEngine(); 
ILogger logger = GetLogger(); 
DossierController controller = new DossierController(repository, mappingEngine, logger); 
ActionResult rsult = controller.Save(...etc...); 

は、あなたが設定し、これらをインスタンス化するためにどのようにするとして、あなたは基本的にあなたのMVCアプリがこれをやっているとまったく同じ方法でこれを行う必要があります。

MVCアプリケーションのどこにこれらが設定されているのかわからない場合は、まず最初にIoCの設定とそこからのバックワードを参照することをお勧めします。

+0

ありがとうございます!私はこれに新しいです、plsを模倣する例がありますか?ちょっと、Hein – Hein73

+0

あなたが基本的にあなたのインターフェースの偽のインスタンスを設定し、それを設定して缶詰の応答を返すように設定することを意味する。 Moockが人気があることは分かっていますが、私はRhino Mocksを使ってサービスをモックするためにライブラリを使う必要があります。基本的な例は[link](http://hibernatingrhinos.com/open-source/rhino-mocks)をご覧ください。 – StanK

+0

だから私はそれを正しく得る嘲笑は私が実際のデータベースにアクセスしないことを意味します。しかし、私はそれを呼び出すと実際に何かを持続させるかどうかを調べるために、どのようにユニットテストをコントローラーに行うことができますか?または、コントローラの実際のSaveメソッドを呼び出さないといけませんか?今、私はrepository.saveをコントローラから直接呼び出します。これはスマートですか?か否か? – Hein73

関連する問題