2013-03-29 43 views
2

我有一段艱難的時間試圖找出爲什麼我運行我的測試時,我的模擬User.Identity.Name返回null。我有一種感覺,當我調用我的controller.ControllerContext時,我可能已經搞砸了,因爲我在那個時候設置了一些路線,但我不確定如何調整回去分配一個對象,就像我在之前的測試中所做的那樣。我用MSTest使用Moq。下面是我的測試:User.Identity.Name被模擬後返回null

[TestMethod] 
    public void Leave_Request_Process_Approved() 
    { 
     var routes = new RouteCollection(); 
     routes.MapHttpRoute(name: "myAPI", routeTemplate: "api/myFolder/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); 
     RouteConfig.RegisterRoutes(routes); 

     var controllerContext = new Mock<ControllerContext>(); 
     var session = new Mock<HttpSessionStateBase>(); 
     session.SetupGet(s => s["altUser"]).Returns("Mod"); 
     controllerContext.Setup(p => p.HttpContext.Session).Returns(session.Object); 
     controllerContext.Setup(p => p.HttpContext.User.Identity.Name).Returns("User"); 
     controllerContext.Setup(p => p.HttpContext.Request.UserHostAddress).Returns("127.0.0.1"); 

     var request = new Mock<HttpRequestBase>(); 
     request.Setup(x => x.ApplicationPath).Returns("/"); 
     request.Setup(x => x.Url).Returns(new Uri("http://temp-removed")); 
     request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

     var context = new Mock<HttpContextBase>(); 
     context.SetupGet(x => x.Request).Returns(request.Object); 

     var response = new Mock<HttpResponseBase>(); 
     response.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x); 
     context.Setup(x => x.Response).Returns(response.Object); 

     var controller = new myController(); 
     controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller); 
     controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes); 

     Assert.IsNotNull(controller.Process(5058, "A", "")); 

    } 

隨着我已經建立在過去的測試中,我通常有我controller.ControllerContext:

controller.ControllerContext = controllerContext.Object; 

我曾嘗試,看看是否有任何controllerContext.Setup選項或context.Setup選項我可以使用,但Intellisense不提供任何我可以看到,以取代我在我的路由信息​​中調用的選項。

+2

想想也許你傷害了它的感情? –

+0

現在,我根本不知道Moq,也不知道MVC(我認爲這是),所以在這裏黑暗中只是一個鏡頭。你的模擬控制器環境在哪裏起作用?我看到你在該方法的早期設置,但我沒有看到它被使用。 –

+0

「在蘇聯俄羅斯,User.Identity.Name嘲笑你」(抱歉,無法抗拒) – Tallek

回答

0

而是嘲諷ControllerContext的,你應該能夠只設置了一個模擬的HttpContextBase.User

context.SetupGet(c => c.User.Identity.Name).Returns("user"); 

再經過嘲弄HTTP上下文的ControllerContext構造函數。

+0

工作很好。我已經接受了答案,因爲它回答了我原來的帖子,但我有一個相關的問題給你。當我嘗試做類似的事情來模擬UserHostAddress(我已經在上下文和請求中嘗試過)時,IP地址顯示爲空。我沒有收到任何異常,但是當我檢查另一個錯誤時,我偶然發現它是空的。 –

+0

在您的請求模擬中爲UserHostAddress設置模擬,而不是在Context.Request.UserHostAddress(稍後在覆蓋Context.Request以返回請求模擬時忽略)。 – PatrickSteele