2012-04-29 7 views
1

私はAzureでMVC4プロジェクトを持っています。私はユーザーのログインを確認する簡単なテストを書いてみたい。私のログインアクションは、最初はそのコントローラパラメータを使用したユニットテスト

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

リターンとNullReferenceExceptionとも

Url.IsLocalUrl(returnUrl) 

で、私は2つの問題を持っている

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

と私のテスト方法

[TestMethod] 
public void UserValidLoginTest() 
{ 
    // Arrange 
    AccountController controller = new AccountController(); 

    // Act 
    LogOnModel model = new LogOnModel() 
    { 
     UserName = "[email protected]", 
     Password = "pass1234" 
    }; 

    var result = controller.LogOn(model, null) as RedirectToRouteResult; 

    // Assert 
    Assert.IsNotNull(result); 
    Assert.AreEqual(result.RouteValues["action"], "Index"); 
} 

として定義されます同じことをする。どうすればこの問題を解決できますか?どうすればテストできますか?私はまた、SeleniumやMoqとの統合テストを書くこともできましたが、Azureでテストする方法がわかりません。任意のアイデアはどのようにこの問題にアプローチする?

+0

静的なクラスのテストは難しいです。これらのオブジェクトにインターフェイスを使用できますか?次に、インターフェイスをモックします。 – Joe

+0

例を挙げることはできますか?私はどのようにそれを行うには便利な例が見つかりません。 – FrEaKmAn

答えて

0

FormsAuthentication & URLクラスのモックを作成する必要があるようです。静的メソッドのように見えるので、それらのメソッドを呼び出すインターフェイスで囲む必要があります。テストでは、同じインターフェイスを実装するモッククラスを使用しますが、モッククラスに必要な模擬結果を返します。実行するテスト。


(静的メソッドhereをあざけるの詳細については)これは、ウィンザー城のように、コントローラの依存関係を注入するIoCコンテナを使用している場合の対処する方がはるかに簡単です。
(あなたはウィンザー城のコンテナhereについて読むことができます)

関連する問題