2010-09-01 82 views
5

我使用這個輔助方法,把我的PartialViewResult成字符串並返回它作爲JSON - http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/ASP.NET MVC - 單元測試與Moq框架RenderPartialViewToString()?

我的問題是,我使用起訂量來模擬控制器,每當我運行單元測試使用這個RenderPartialViewToString ()方法,我得到了「對象引用未設置爲對象的實例」。 ControllerContext上的錯誤。

private ProgramsController GetController() 
{ 
var mockHttpContext = new Mock<ControllerContext>(); 
mockHttpContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("test"); 
mockHttpContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true); 
// Mock Repositories 
var mockOrganizationRepository = new MockOrganizationRepository(MockData.MockOrganizationsData()); 
var mockIRenderPartial = new BaseController(); 
var controller = new ProgramsController(mockOrganizationRepository, mockIRenderPartial); 
controller.ControllerContext = mockHttpContext.Object; 
return controller; 
} 

這將返回一個代理控制器,也許這就是我得到這個錯誤的原因。任何想法如何進行單元測試?

非常感謝。

+0

其中*究竟*請問'NullReferenceException'發生? – bzlm 2010-09-02 06:52:14

+0

它發生在ControllerContext上,我認爲是因爲Moq嘲笑控制器並且只返回代理...這是行: ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,viewName); 當我將鼠標懸停在其上時,ControllerContext.Controller爲空。 謝謝, – Saxman 2010-09-02 15:55:19

+0

在RouteData中設置「controller」和「action」參數後,我也收到了這個異常。全堆棧跟蹤:http://pastebin.com/S8c26JLD – EMP 2011-07-19 11:28:03

回答

4

試試這個:

public static void SetContext(this Controller controller) 
     { 
      var httpContextBase = new Mock<HttpContextBase>(); 
      var httpRequestBase = new Mock<HttpRequestBase>(); 
      var respone = new Mock<HttpResponseBase>(); 
      var session = new Mock<HttpSessionStateBase>(); 
      var routes = new RouteCollection(); 
      RouteConfigurator.RegisterRoutesTo(routes); 

      httpContextBase.Setup(x => x.Response).Returns(respone.Object); 
      httpContextBase.Setup(x => x.Request).Returns(httpRequestBase.Object); 
      httpContextBase.Setup(x => x.Session).Returns(session.Object); 
      session.Setup(x => x["somesessionkey"]).Returns("value"); 
      httpRequestBase.Setup(x => x.Form).Returns(new NameValueCollection()); 
      controller.ControllerContext = new ControllerContext(httpContextBase.Object, new RouteData(), controller); 
      controller.Url = new UrlHelper(new RequestContext(controller.HttpContext, new RouteData()), routes); 
     } 
+1

嗨Omu,我在這一行上有這個錯誤:'ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,viewName);'錯誤是「RouteData必須包含名爲'controller'的項目,其中包含非空字符串值。「謝謝。 – Saxman 2010-09-08 16:09:23

+0

@saxman嘗試添加它 – Omu 2010-09-08 16:48:07

+0

我試過但沒有運氣,同樣的錯誤:(***編輯***如何手動添加一個控制器變量到RouteData? – Saxman 2010-09-08 17:04:44