9

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

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

 }

FormAuthenticationService クラスでは、

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);

この行。または、Moqへの方法はありますか

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

ASP.Net MVC2 プロジェクトを変更せずにMoq フレームワークを使用します。

4

1 に答える 1

11

このようIFormsAuthenticationServiceにあなたへの依存関係として注入するLogOnController

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

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

最初のコンストラクターはフレームワーク用であるため、実行時に正しいインスタンスIFormsAuthenticationServiceが使用されます。

テストで、LogonController以下のようにモックを渡して、他のコンストラクターを使用するインスタンスを作成します

var mockformsAuthenticationService = new Mock<IFormsAuthenticationService>();
//Setup your mock here

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

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

お役に立てれば。モックのセットアップは省きました。設定方法がわからない場合はお知らせください。

于 2012-07-09T14:17:52.707 に答える