2012-07-09 6 views
7

こんにちは私はASP.Net MVC2プロジェクトで単体テストをやっています。私はMoqフレームワークを使用しています。私のLogOnController、FormAuthenticationServiceクラスでMoqを使ったFormsAuthentication.SetAuthCookieの模倣

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl = "") 
{ 
    FormsAuthenticationService FormsService = new FormsAuthenticationService(); 
    FormsService.SignIn(model.UserName, model.RememberMe); 

} 

、で

public class FormsAuthenticationService : IFormsAuthenticationService 
    { 
     public virtual void SignIn(string userName, bool createPersistentCookie) 
     { 
      if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot  be null or empty.", "userName"); 
      FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
     } 
     public void SignOut() 
     { 
      FormsAuthentication.SignOut(); 
     } 
    } 

私の問題は、私は

FormsService.SignIn(model.UserName, model.RememberMe); 

この行の実行を避けることができる方法です。それとも私のASP.Net MVC2プロジェクトを変更せずに部品番号のフレームワークを使用して

FormsService.SignIn(model.UserName, model.RememberMe); 

をMOQする方法はあります。 IFormsAuthenticationServiceの正しいインスタンスを実行時に使用されるように、あなたのLogOnController

このような
private IFormsAuthenticationService formsAuthenticationService; 
public LogOnController() : this(new FormsAuthenticationService()) 
{ 
} 

public LogOnController(IFormsAuthenticationService formsAuthenticationService) : this(new FormsAuthenticationService()) 
{ 
    this.formsAuthenticationService = formsAuthenticationService; 
} 

への依存関係として

+0

SUT(テスト中のシステム) - 'LogOnController'または' FormsAuthenticationService'とは何ですか?前者の場合、 'FormsAuthenticationService'のために偽物を提供し、' SignIn'メソッドが呼び出されていることを確認する必要があります。後者は、( 'HttpResponse'に)クッキーを追加するための現在の' HttpContext'を必要とするため、単体テストが難しくなります。 –

+0

LogOnControllerをテストします。私はFormsService.SignIn(model.UserName、model.RememberMe)をモックしようとしました。 このようにして、 var formService = new Mock (); しかし、formservice.SignInは何も返しません。その行の実行を避けるにはどうすればよいのですか?私はMoqを使用してそれを模擬する方法を知らない。 – Dilma

答えて

9

を注入IFormsAuthenticationService最初のコンストラクタは、フレームワークのためです。あなたのテストで今

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl = "") 
{ 
    formsAuthenticationService.SignIn(model.UserName, model.RememberMe); 
} 

・ホープ、この以下のようにプライベートフィールドformsAuthenticationServiceを使用するようにアクションコードを変更し

var mockformsAuthenticationService = new Mock<IFormsAuthenticationService>(); 
//Setup your mock here 
以下のようにモックを渡すことで、他のコンストラクタを使用して LogonControllerのインスタンスを作成します助けてください。私はあなたのために擬似セットアップを省いた。あなたがそれを設定する方法がわからない場合は教えてください。

+0

ありがとうSuhas。私はASP.Net u = Unit testingの初心者ですから、このコードをどこに置くべきか分かりません。 mvcプロジェクトでLogOnControllerを変更する必要があるのですか?説明できるほど親切でお願いします。前もって感謝します。 – Dilma

+0

ありがとう..それは動作します..ありがとうSuhas。 – Dilma

+0

私はそれが今あなたには分かりやすいことを願っています。あなたがまだこの問題に直面している場合は、私に教えてください。 – Suhas

関連する問題