2016-04-05 12 views
1

Ich versuche, Integrationstests für ASP.NET MVC-Controller zu schreiben. In meinem Controller, ich verwenden Funktion eines Helfers einen Razor Blick auf Zeichenfolge zu machen, das wie dieseASP.NET MVC Rendern In Unit-Test anzeigen

 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(); 
     } 
    } 

ich in Controller-Aktionen verwendet, um diese Hilfsfunktion ist eine Ansicht Zeichenfolge im Gegenzug, es zu AJAX machen Anrufen wie die unten

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

schrieb ich einen Test für die Aktion wie oben

[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 
    } 

folgen Wenn ich den Code ausführen es mit dieser Ausnahme wird kommen:

enter image description here

Offenbar ist es da, dass die Display von Controller null ist. Ich habe versucht, es auch zu verspotten, aber es kommt mit demselben Fehler.

Wie rende ich eine Ansicht im Komponententest?

Antwort

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

Und versuchen Sie result.View.Render().

+0

controller.TestAction() führt das Rendering selbst aus und gibt es als JSON zurück. Es funktioniert, wenn ich die Anwendung im Browser ausführe, aber nicht im Komponententest funktioniert. – Shahin

+0

Weil an dieser Stelle ein ViewResult vorhanden ist, das den Inhalt der Antwort rendert. [Anforderungslebenszyklus] (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

Ich sage, dass TestAction ViewResult nicht zurückgibt – Shahin

Verwandte Themen