带控制器参数的单元测试

时间:2012-04-29 21:17:59

标签: c# asp.net-mvc-3

我有一个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测试它。任何想法如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

您似乎需要为FormsAuthentication&创建模拟。网址类。由于它们似乎是静态方法,因此您应该使用将调用它们的接口来包装它们的用法,并且在测试中,只使用也实现相同接口的mock类,但将返回您需要的模拟结果。试运行。
(有关模拟静态方法的更多信息here

如果你使用IoC容器注入控制器的依赖关系,比如Windsor Castle,这就容易多了。
(你可以阅读windsor castle container here