2012-04-29 57 views
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 = "[email protected]", 
     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进行测试。任何想法如何解决这个问题?

+0

测试静态类很困难。你可以使用这些对象的接口吗?然后模拟接口。 – Joe

+0

我们可以做一个例子吗?我没有找到任何有用的例子如何做到这一点。 – FrEaKmAn

回答

0

看起来你需要为FormsAuthentication & Url Classes创建模拟。因为它们看起来像是静态方法,所以你应该用一个接口来包装它们的用法,在测试中,只需使用一个也实现相同接口的模拟类,但会返回你需要的模拟结果测试运行。

(上嘲讽静态方法here更多信息)这是容易得多,如果你使用IoC容器注入控制器的依赖,像温莎城堡做。
(你可以阅读关于温莎城堡容器here