【发布时间】:2010-07-09 09:07:15
【问题描述】:
我正在学习如何对 ASP.NET MVC 控制器操作进行单元测试。具体来说,我正在尝试模拟 ControllerContext,以便我可以测试访问 HttpContext.Current.User.Identity.Name 的操作。
我正在使用起订量。
在我打开 MockBehavior.Strict 之前,一切都很顺利。我知道如果代码未能调用我标记为可验证的东西,这将引发异常。显然,如果没有调用我不提供设置的“额外”方法(如 IsChildAction),它也会引发异常。
[TestMethod]
public void Index_Get_AccessesUserIdentityName()
{
// Arrange
var mock = new Mock<ControllerContext>(MockBehavior.Strict);
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("treycarroll").Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
mock.Verify();
...
}
这是我正在测试的控制器操作:
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!"+User.Identity.Name;
return View();
}
返回View()时触发异常;语句被执行。错误消息告诉我,我需要一个设置方法来调用 IsChildAction,所以我将测试类更新为:
[TestMethod]
public void Index_Get_AccessesUserIdentityName()
{
// Arrange
var mock = new Mock<ControllerContext>(MockBehavior.Strict);
string expectedUserName = "treycarroll";
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(expectedUserName).Verifiable();
mock.SetupGet(m => m.IsChildAction).Returns(true).Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;
// Act
ViewResult result = controller.Index() as ViewResult;
string actualUserName = controller.ControllerContext.HttpContext.User.Identity.Name;
// Assert
mock.Verify();
Assert.AreEqual(actualUserName, expectedUserName);
Assert.IsNotNull(result);
}
...
之后我收到一个类似的错误,即没有 ControllerContext.RouteData 的设置方法。通过消除过程,我最终可以为所有丢失的调用添加 Setup 方法,但这似乎不正确。也许我误解了 MockBehavior.Strict 的使用,但我认为您打开它是为了避免获取属性的默认值(例如我要检查的 User 对象的 null )。我在这里错过了什么?
【问题讨论】:
标签: asp.net-mvc-2 mocking moq