2010-07-08 31 views
0

我正在忙着學習如何單元測試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)。我在這裏錯過了什麼?

回答

5

如果有什麼不同於預期,嚴格的模擬將立即失敗。所以這意味着,如果任何方法調用沒有在期望中指定將失敗。另一方面,一個非嚴格的模擬忽略,這種調用

相關問題