2016-04-05 8 views
1

ASP.NET MVCコントローラの統合テストを作成しようとしています。私のコントローラでは、私はAJAXに復帰して、それを文字列にビューをレンダリングするためにコントローラのアクションで、このヘルパー関数を使用し、このユニットテストでのASP.NET MVCレンダービュー

 private string Render(string viewName, object model) 
    { 
     ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, 
       viewName); 
      var viewContext = new ViewContext(ControllerContext, viewResult.View, 
       ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

のようなものである文字列にカミソリビューをレンダリングするためにヘルパー関数を使用し、以下のように呼び出しますアクション

[HttpPost] 
    public virtual ActionResult TestAction() 
    { 
     var model = GetModel(); 
     var razorViewToString = Render("TestAction", model); 
     var data = new 
     { 
      html = razorViewToString 
     }; 
     return Json(data, JsonRequestBehavior.AllowGet); 
    } 

私は、コードを実行すると

[Test] 
    public void TestActionTest() 
    { 
     var request = new Mock<HttpRequestBase>(); 
     request.SetupGet(x => x.IsAuthenticated).Returns(true); 
     var context = new Mock<HttpContextBase>(); 
     context.SetupGet(x => x.Request).Returns(request.Object); 
     var controller = new Controller(); 
     var routeData = new RouteData(); 
     routeData.Values.Add("controller", "TestController"); 
     routeData.Values.Add("action", "TestAction"); 
     var controllerContext = new ControllerContext(context.Object, routeData, controller); 
     ViewEngines.Engines.Clear(); 
     ViewEngines.Engines.Add(new RazorViewEngine()); 
     controller.ControllerContext = controllerContext; 
     var result = controller.TestAction(); 
     // assert 
    } 

に従うことは、この例外を考え出すだろうと、私は上記のアクションのためのテストを書いた:

enter image description here

ControllerContextののDisplayModeがnullであることをので、どうやらそれはです。私もそれを嘲笑しようとしたが、それは同じエラーが付属しています。

ユニットテストでビューをレンダリングするにはどうすればよいですか?

答えて

-1
ViewResult result = controller.TestAction() as ViewResult; 

また、result.View.Render()を試してください。

+0

controller.TestAction()はrender自体を実行し、JSONとして返します。私はブラウザでアプリケーションを実行するが、単体テストでは動作しません。 – Shahin

+0

この時点で、応答にコンテンツをレンダリングするViewResultがあるためです。 [ライフサイクルの要求](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/14/2425.image.png) –

+0

私はTestActionがViewResultを返さないと言っています – Shahin

関連する問題