1

我有一个使用 Azure 的 MVC4 项目。我想编写简单的测试来检查用户登录。我的登录操作定义为

    [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");
}

我有两个问题,首先是

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

返回 NullReferenceException 并且还

    Url.IsLocalUrl(returnUrl)

做同样的事情。我怎么能解决这个问题?我怎么能测试它?我也可以使用 Selenium 或 Moq 编写集成测试,但我不确定如何使用 Azure 对其进行测试。任何想法如何解决这个问题?

4

1 回答 1

0

似乎您需要为 FormsAuthentication 和 Url 类创建模拟。因为看起来这些是静态方法,所以你应该用一个调用它们的接口来包装它们的用法,并且在测试中,只需使用一个也实现相同接口的模拟类,但会返回你需要的模拟结果测试运行。
(有关在此处模拟静态方法的更多信息)

如果您使用 IoC 容器来注入控制器的依赖项,例如 Windsor Castle,这将更容易做到。(您可以在此处
阅读有关温莎城堡集装箱的信息)

于 2012-04-29T21:23:20.073 回答