我正在忙着學習如何單元測試ASP.NET MVC控制器操作。具體來說,我試圖嘲諷ControllerContext,以便我可以測試訪問HttpContext.Current.User.Identity.Name的操作。ControllerContext.IsChildAction調用失敗,模擬行爲嚴格。所有的調用必須有一個設置
我正在使用Moq。
事情一直很順利,直到我打開MockBehavior.Strict。我知道如果代碼未能調用我標記爲Verifiable的東西,這會引發異常。顯然,如果沒有提供設置(如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();
}
異常被觸發時返回查看();語句被執行。該錯誤消息告訴我,我需要調用一個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。通過消除過程,我可以爲所有缺失的調用添加設置方法,但這看起來不正確。也許我誤解了MockBehavior.Strict的使用,但我認爲你打開它是爲了避免爲你的屬性獲取默認值(比如我想檢查的User對象爲null)。我在這裏錯過了什麼?