1

Azure を使用した MVC4 プロジェクトがあります。ユーザーのログインを確認する簡単なテストを書きたいと思います。My Login アクションは次のように定義されます

    [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 = "user@example.com",
        Password = "pass1234"
    };

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

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

私には2つの問題があります。まず、

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

NullReferenceException を返し、さらに

    Url.IsLocalUrl(returnUrl)

同じことをします。どうすればこれを解決できますか?どうすればテストできますか?Selenium または Moq との統合テストを作成することもできますが、Azure でテストする方法がわかりません。この問題にアプローチする方法はありますか?

4

1 に答える 1

0

FormsAuthentication & Url Classes のモックを作成する必要があるようです。これらは静的メソッドのように見えるため、それらを呼び出すインターフェースでそれらの使用法をラップする必要があります。テストでは、同じインターフェースを実装するモッククラスを使用するだけで、必要なモック結果を返します実行するテスト。
(静的メソッドのモックの詳細については、こちらを参照してください)

Windsor Castle のように、IoC コンテナーを使用してコントローラーの依存関係を注入している場合、これははるかに簡単に実行できます。
(ウィンザー城のコンテナについてはこちらをご覧ください)

于 2012-04-29T21:23:20.073 に答える